如何从matplotlib中的数字中检索colorbar实例

时间:2013-11-06 16:00:50

标签: python matplotlib colorbar

所有。我想更改图像数据时更新图形的颜色条。如下所示:

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的东西。谢谢你!

2 个答案:

答案 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())