Python matplotlib更改超出颜色条范围的值的默认颜色

Posted

技术标签:

【中文标题】Python matplotlib更改超出颜色条范围的值的默认颜色【英文标题】:Python matplotlib change default color for values exceeding colorbar range 【发布时间】:2012-07-08 07:41:23 【问题描述】:

当用颜色填充网格时,例如在 pyplot 中使用 contourf 时,我需要找到一种方法来更改 pyplot 用来填充超出颜色栏指定范围的数据的颜色。我希望有一个静态颜色条,它不会自动更改其范围以适应数据的最大值/最小值,因此偶尔会有超出其界限的极端值是不可避免的,并且需要为这些值指定颜色。

超出颜色条边界的值的默认颜色是白色,如果颜色图没有白色作为其结束颜色,它可能会与周围的数据发生明显的冲突。示例图像如下所示 - 当值超出颜色条的负值范围时,请注意白色填充:

我相信有一种方法可以指定在每个边界使用哪种颜色,如果使用 rcParams 超出它们,但我无法在任何地方找到有关此的信息。

任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

可以使用颜色图的set_overset_under 方法设置越界颜色;见the documentation。创建颜色图时,您需要指定这些值。不过,我没有看到任何 matplotlibrc 设置来为此设置默认值。您可能还想在 matplotlib 邮件列表上提问。

编辑:我知道发生了什么。您描述的白色区域没有超出颜色范围的限制。它只是轴的空白背景。因为您只绘制某些级别,所以该范围之外的任何级别都不会被绘制,将这些区域留空。要获得您想要的,请执行以下操作:

cs = pyplot.contourf(x,y,z,levels=np.arange(50, 220, 20), cmap=pyplot.cm.jet, extend="both")
cs.cmap.set_under('k')
cs.set_clim(50, 210)
cb = pyplot.colorbar(cs)

“扩展”参数是关键;它告诉轮廓继续绘制所有轮廓,但将所有超出给定范围的轮廓折叠为“太大”和“太小”类别。 cs.set_clim 调用是解决我在调试时在 contourf 中发现的一个奇怪问题所必需的;出于某种原因,当您使用extend 时,它会操纵数据限制,因此我们需要将它们重置为我们想要的样子。

此外,就风格而言,您不应该做像Colormap.set_under(cmap,color='k') 这样的事情。这是调用类方法并显式传递实例,这是一种奇怪的方法。只需cmap.set_under(color="k")

【讨论】:

好的,但是在尝试使用这些方法时会出现问题。这是在尝试之前有效的代码行:cs = m.contourf(x,y,data,clevs,cmap=pyplot.cm.Spectral) 这是我刚刚尝试过的:cmap=matplotlib.colors.Colormap('Spectral') matplotlib.colors.Colormap.set_under(cmap,color=(0.4667,0,0.5333)) cs = m.contourf(x,y,data,clevs,cmap=cmap) 产生此错误:File "/usr/lib/pymodules/python2.7/matplotlib/contour.py", line 943, in _process_colors self.monochrome = self.cmap.monochrome AttributeError: Colormap instance has no attribute 'monochrome' 您正在实例化基础颜色图类,创建一个新的空颜色图,而不是使用“光谱”颜色图。做你想做的最简单的方法可能是先做cmap = pyplot.cm.Spectral,然后再做cmap.set_under(...)。这将修改 Spectral 颜色图以具有指定的低于值。请注意,由于您正在修改实际的 Spectral 颜色图对象,因此这将对使用 Spectral 颜色图的所有后续绘图保持有效。 这是有道理的,但使用它并没有改变结果图,并且“上/下”颜色仍然是白色。 抽象地做到这一点变得太难了。您需要提供一些示例代码。 这里。此脚本尝试将“下”颜色设置为黑色而不是白色,但颜色条下限以下的值仍为白色。抱歉不知道如何在 cmets 中很好地格式化多行代码。 from matplotlib import pyplot as plt from numpy import arange,meshgrid from matplotlib.colors import Colormap x,y = arange(-10,10),arange(-10,10) x,y=meshgrid(x,y) z = x**2+y**2 clevs=arange(50,220,20) cmap=plt.cm.jet Colormap.set_under(cmap,color='k') cs = plt.contourf(x,y,z,clevs,cmap=cmap) plt.colorbar(cs) plt.show()

以上是关于Python matplotlib更改超出颜色条范围的值的默认颜色的主要内容,如果未能解决你的问题,请参考以下文章

python使用matplotlib可视化散点图(scatter plot)根据matplotlib中数据点的值更改数据点的颜色数值更大的点颜色更深

在 python matplotlib 中将矩阵作为输出变量传递时,更改线条的颜色

Matplotlib:更改轴的颜色

Matplotlib 3.3.3:更改单个刻度的颜色不再起作用

Matplotlib - 在 hline 上方/下方更改线条颜色

如何更改 Matplotlib 中颜色条刻度标签的字体大小?