2011-04-21 321 views
8

我有使用对数颜色缩放的等值线图的问题。我想要手动指定水平。然而,Matplotlib以奇怪的方式绘制颜色条 - 标签放置不好,只出现一种颜色。这个想法是基于 http://adversus.110mb.com/?cat=8python matplotlib等高线图对数色标

有没有人在那里,谁可以帮助我? 我用的是最新的Git存储库matplotlib版本V1.1.0(2011-04-21)

import matplotlib.pyplot as plt 
import numpy as np 
from matplotlib.mlab import bivariate_normal 
from matplotlib.colors import LogNorm 
from matplotlib.backends.backend_pdf import PdfPages 


delta = 0.5 

x = np.arange(-3.0, 4.001, delta) 
y = np.arange(-4.0, 3.001, delta) 
X, Y = np.meshgrid(x, y) 
Z = bivariate_normal(X, Y, 1.0, 1.0, 0.0, 0.0) 

fig = plt.figure() 
ax = fig.add_subplot(1,1,1) 
#axim = ax.imshow(Z, norm = LogNorm()) 
axim = ax.contourf(X,Y,Z,levels=[1e0,1e-1,1e-2,1e-3],cmap=plt.cm.jet,norm = LogNorm()) 
cb = fig.colorbar(axim) 

pp = PdfPages('fig.pdf') 
pp.savefig() 
pp.close() 


plt.show() 

非常感谢您的帮助!它完美的作品,如你所说... 不过,我还有一个问题:为什么matplotlib不允许我在数模式选择的水平线数:

import matplotlib.pyplot as plt 
import numpy as np 
from matplotlib.mlab import bivariate_normal 
from matplotlib.colors import LogNorm 
from matplotlib.backends.backend_pdf import PdfPages 


delta = 0.5 

x = np.arange(-3.0, 4.001, delta) 
y = np.arange(-4.0, 3.001, delta) 
X, Y = np.meshgrid(x, y) 
Z = bivariate_normal(X, Y, 1.0, 1.0, 0.0, 0.0) 

fig = plt.figure() 
ax = fig.add_subplot(1,1,1) 
#axim = ax.imshow(Z, norm = LogNorm()) 
#axim = ax.contourf(X,Y,Z,levels=[1e-3,1e-2,1e-1,1e0],cmap=plt.cm.jet,norm = LogNorm()) 
axim = ax.contourf(X,Y,Z,20,cmap=plt.cm.jet,norm = LogNorm()) 
cb = fig.colorbar(axim) 

pp = PdfPages('fig.pdf') 
pp.savefig() 
pp.close() 


plt.show() 

http://i.stack.imgur.com/VeVFQ.png

这是我原来的问题...

回答

9

所以它很容易修复;你的水平顺序意味着最低水平最后得出,因此涵盖了一切! 尝试:

axim = ax.contourf(X,Y,Z,levels=[1e-3, 1e-2, 1e-1, 1e0],cmap=plt.cm.jet,norm = LogNorm()) 

取而代之,你应该得到所需的结果。

+0

谢谢,工作! - 也许你也可以回答第二个问题? – 7asd23hasd 2011-04-21 19:12:25

+0

@ 45z23dsa:看起来LogNorm设置的间距在关卡中设置为10,因为数据只能下降到〜1e-8,最终得到8个关卡。你可以通过改变基地来解决这个问题。例如。 'lev2 = np.arange(np.floor(np.log2(Z.min()) - 1),np.ceil(np.log2(Z.max())+ 1)'后面跟着'levs = np。 power(2,lev_exp)'会给你基础的2个间隔的层次,然后你可以通过'levels'参数传递,然而要准确地说20个层次,你需要使用非标准的基地 – jmetz 2011-04-22 15:27:55

+0

亲爱的mutzmatron,感谢您对此进行调查!因此,简单提供我想要的关卡列表可能会更容易...因此,我认为这两个问题都已解决! – 7asd23hasd 2011-04-24 08:58:50

2

看起来像levels预计会增加值。尝试将它们更改为:levels=[1e-3, 1e-2, 1e-1, 1e0]并查看是否解决了您的问题。

+0

谢谢工作!也许你也可以回答第二个问题? – 7asd23hasd 2011-04-21 19:12:00