设置 matplotlib 颜色条范围

26

我想设置 matplotlib 的色条范围。以下是我目前的代码:

import numpy as np
import matplotlib.pyplot as plt
x = np.arange(20)
y = np.arange(20)
data = x[:-1,None]+y[None,:-1]

fig = plt.gcf()
ax = fig.add_subplot(111)

X,Y = np.meshgrid(x,y)
quadmesh = ax.pcolormesh(X,Y,data)
plt.colorbar(quadmesh)

#RuntimeError: You must first define an image, eg with imshow
#plt.clim(vmin=0,vmax=15)  

#AttributeError: 'AxesSubplot' object has no attribute 'clim'
#ax.clim(vmin=0,vmax=15) 

#AttributeError: 'AxesSubplot' object has no attribute 'set_clim'
#ax.set_clim(vmin=0,vmax=15) 

plt.show()

我该如何在这里设置色条限制?

3个回答

38

论据。它总是你尝试的最后一件事:

quadmesh.set_clim(vmin=0, vmax=15)

工作。


8
我希望更深入地了解这个 API 的工作原理。如果有人能从 API 的角度解释为什么 ax.set_xlim 起作用而 ax.set_clim 没有起作用,我很想听听(我相信其他人可能会有更好的答案 - 所以如果您可以,请详细解释!) - mgilson
4
我不确定这是否回答了你的问题,但如果你查看quadmesh.__class__.mro(),你会发现quadmesh的类具有ScalarMappable混合类。如果你查看matplotlib/cm.py,你会发现它是ScalarMappable混合类处理颜色映射,特别是它提供了set_clim方法。 - unutbu
4
每个(ScalarMappable)艺术家控制自己的颜色。颜色条附加在一个ScalarMappable上(通过'plt.colorbar(quadmesh)'调用)。因此,艺术家的颜色映射控制着颜色条的颜色映射。它不是针对整个坐标轴的颜色映射。因此,'ax'没有'set_clim'属性。 - unutbu
3
请看一下plt.clim的作用,它会调用gci(获取当前“image”),并在结果上调用set_clim。 还有一个函数plt.sci(),可以设置当前图片,因此plt.clim将起作用。 我猜这没有完成是因为您通过pyplot接口的OO界面进行了pcolor调用。 - tacaswell
1
谢谢。我正在寻找这个解决方案。我了解到你也可以只需执行 ax.pcolormesh(X, Y, data, vmin=0, vmax=15) - tommy.carstensen
显示剩余4条评论

4

Matplotlib 1.3.1 - 看起来色条刻度只有在实例化色条时才会绘制。更改色条限制(set_clim)不会导致重新绘制刻度。

我找到的解决方法是在与原始色条相同的轴条目中重新实例化色条。在这种情况下,axes [1] 是原始色条。使用cax =(子轴)kwarg添加了一个新的色条实例。

           # Reset the Z-axis limits
           print "resetting Z-axis plot limits", self.zmin, self.zmax
           self.cbar = self.fig.colorbar(CS1, cax=self.fig.axes[1]) # added
           self.cbar.set_clim(self.zmin, self.zmax)
           self.cbar.draw_all()

4

[抱歉,实际上是对弗吉尼亚回答中The Red Gator的评论,但我没有足够的声望来评论]

在绘制完imshow对象并使用imshowobj.set_data()更改数据后,我卡在了更新colorbar上。 使用cbarobj.set_clim()确实会更新颜色,但不会更新colorbar的刻度或范围。相反,您必须使用imshowobj.set_clim(),这将正确地更新图像和colorbar。

data = np.cumsum(np.ones((10,15)),0)
imshowobj = plt.imshow(data)
cbarobj = plt.colorbar(imshowobj) #adjusts scale to value range, looks OK
# change the data to some data with different value range:
imshowobj.set_data(data/10) #scale is wrong now, shows only dark color
# update colorbar correctly using imshowobj not cbarobj:
#cbarobj.set_clim(0,1) #! image colors will update, but cbar ticks not
imshowobj.set_clim(0,1) #correct

@Idoyle,你能解释一下为什么你在除法运算中使用了 set_data 吗? - Cloud Cho
@CloudCho 哦,我几乎忘记了今天...我想我想展示一下事后更改比例尺的效果:1.设置一些初始数据,2.更改数据(在这种情况下为原始值的1/10)->结果看起来不正确/未使用完整比例尺,3.更新颜色比例尺->再次看起来很好。希望这可以帮助到你。 - ldoyle

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