Python matplotlib 等高线图对数颜色尺度

14 投票
2 回答
41159 浏览
提问于 2025-04-16 16:11

我在使用对数颜色缩放的等高线图时遇到了一些问题。我想手动指定颜色级别。但是,Matplotlib绘制的颜色条看起来很奇怪——标签的位置不太对,而且只显示了一种颜色。这个想法是基于http://adversus.110mb.com/?cat=8

有没有人能帮帮我?我使用的是最新的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()

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

这就是我最初的问题……

2 个回答

2

看起来 levels 需要的是一个逐渐增大的数值。你可以试着把它改成:levels=[1e-3, 1e-2, 1e-1, 1e0],看看这样是否能解决你的问题。

16

这个问题很简单就能解决;你的层级顺序导致最低的层级最后被绘制出来,所以它把其他的都盖住了!

试试下面的代码:

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

这样你就能得到想要的效果了。

撰写回答