Python Matplotlib如何改变超出颜色条范围的默认颜色?

26

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

当数据超出颜色条的边界时,超过颜色条边界的默认颜色是白色,如果颜色映射没有白色作为终点颜色,则会与周围数据产生醒目的对比。下面显示了示例图像-请注意当值超出颜色条的负范围时的白色填充:

enter image description here

我相信有一种方法可以通过使用rcParams来指定每个边界超过的颜色,但我无法在任何地方找到相关信息。

任何帮助将不胜感激。

1个回答

37
可以使用色图的 set_overset_under 方法来设置越界颜色,具体请参见 文档。在创建色图时需要指定这些值。虽然我没有看到任何 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)
"extend"参数是关键,它告诉contourf绘制所有轮廓,但将给定范围外的所有轮廓折叠成“太大”和“太小”的类别。调用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' - Levi Cowan
您正在实例化基础Colormap类,创建一个新的、空的Colormap,而不是使用“spectral”colormap。实现您想要的最简单的方法可能是执行cmap = pyplot.cm.Spectral ,然后执行cmap.set_under(...)。这将修改Spectral colormap以具有指定的下限值。请注意,由于您正在修改实际的Spectral colormap对象,因此这将在所有使用Spectral colormap的后续绘图中保持有效。 - BrenBarn
这在抽象层面上变得太难了。你需要提供一些示例代码。 - BrenBarn
这个脚本试图将“下限”颜色设置为黑色而不是白色,但是颜色条下限以下的值仍然是白色。抱歉,不知道如何在注释中漂亮地格式化多行代码。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() - Levi Cowan
非常棒,它可以正常工作了,而且我现在理解了问题。非常感谢你的时间。 - Levi Cowan
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接