【问题标题】:Python matplotlib contour plot logarithmic color scalePython matplotlib 等高线图对数色标
【发布时间】:2011-08-10 12:33:15
【问题描述】:

我在使用对数颜色缩放的等高线图中遇到问题。我想手动指定级别。然而,Matplotlib 以一种奇怪的方式绘制颜色条——标签放置得不好,只出现了一种颜色。这个想法是基于 http://adversus.110mb.com/?cat=8

有没有人可以帮助我? 我使用最新的 git-repository 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

这是我原来的问题...

【问题讨论】:

    标签: python matplotlib plot logging contour


    【解决方案1】:

    看起来levels 期望值增加。尝试将它们更改为:levels=[1e-3, 1e-2, 1e-1, 1e0],看看是否能解决您的问题。

    【讨论】:

    • 感谢工作!或许你也可以回答第二个问题?
    【解决方案2】:

    所以很容易修复;您的级别顺序意味着最低级别最后绘制,因此涵盖了所有内容! 试试:

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

    相反,您应该得到想要的结果。

    【讨论】:

    • 谢谢,辛苦了! - 或许你也可以回答第二个问题?
    • @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 个级别,您需要使用非标准基础。
    • 亲爱的mutzmatron,感谢您对此进行调查!因此,简单地提供我想要的级别列表可能更容易......所以我认为这两个问题都已解决!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-18
    • 1970-01-01
    • 2019-08-09
    • 2015-11-26
    • 2014-09-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多