所有。我想更改图像数据时更新图形的颜色条。如下所示:
img = misc.lena()
fig = plt.figure()
ax = plt.imshow(im)
plt.colorbar(ax)
newimg = img+10*np.randn(512,512)
def update_colorbar(fig,ax,newimg):
cbar = fig.axes[1]
ax.set_data(newimg)
cbar.update_normal(ax)
plt.draw()
但似乎fig.axes()的返回结果没有像我预期的颜色条实例。我可以将colorbar实例作为参数传递给更新函数,但我认为只传递一个fig参数可能就足够了。任何人都可以解释一下如何从图中检索颜色条?或者为什么'fig.axes()'不返回AxesImage或Colobar实例,只返回Axes或AxesSubplot?我想我只需要更多地理解Axes / Figure的东西。谢谢你!
答案 0 :(得分:19)
有时即使它没有保存在变量中,检索颜色栏也很有用。 在这种情况下,可以使用以下方法从图中检索颜色条:
#create a test image
img=np.arange(20).reshape(5,4)
plt.imshow(img)
plt.colorbar()
ax=plt.gca() #plt.gca() for current axis, otherwise set appropriately.
im=ax.images #this is a list of all images that have been plotted
cb=im[-1].colorbar #in this case I assume to be interested to the last one plotted, otherwise use the appropriate index
现在,您可以对cb
进行操作,就像它已存储一样,更改xlim或调用更新,如其他注释中所述。或者您可以使用cb.remove()
将其删除,然后使用plt.colorbar()
重新创建。{1}}。
plt.draw()
或show
。
顺便说一句,图像是与颜色条相关联的可映射的图像,可以使用cb.mappable
获得。
答案 1 :(得分:18)
首先,我认为你们在轴(基本上是情节),图形,标量可映射(在这种情况下是图像)和颜色条实例之间会有点混淆。
figure
是绘图所在的窗口。它是顶级容器。
每个数字通常都有一个或多个axes
。这些是情节/子图。
色条也在图中。添加颜色条会为要显示的颜色条创建一个新轴(除非另有指定)。(通常不能在与图像相同的轴上显示,因为颜色条需要有自己的x和y限制,等)
您的一些困惑是由于您正在混合状态机界面和OO界面。这样做很好,但你需要了解OO接口。
fig.axes[1]
不是colorbar实例。它是绘制颜色条的轴。(另外,fig.axes[1]
只是图中的第二个轴。它恰好是颜色条用于具有一个子图和一个颜色条的图形的轴,但是一般情况不会这样。)
如果要更新颜色条,则需要保留colorbar
返回的颜色条实例。
以下是您正常处理事情的示例:
import matplotlib.pyplot as plt
import numpy as np
data = np.random.random((10,10)) # Generate some random data to plot
fig, ax = plt.subplots() # Create a figure with a single axes.
im = ax.imshow(data) # Display the image data
cbar = fig.colorbar(im) # Add a colorbar to the figure based on the image
如果您要使用update_normal
更新颜色栏,则需要ScalarMappable
(例如由imshow
创建的图像,即scatter
创建的集合,要传递ContourSet
创建的contour
等。(还有其他方法可以做到。通常你只想更新限制,而不是整个事情。)在在上面代码的情况下,您可以调用cbar.update_normal(im)
。
但是,您尚未创建新的AxesImage
,您只是更改了它的数据。因此,您可能只想这样做:
cbar.set_clim(newimg.min(), newimg.max())