如何在matplotlib中从图中检索colorbar实例

2024-04-25 01:20:23 发布

您现在位置:Python中文网/ 问答频道 /正文

全部。我想在图像数据更改时更新图形的颜色栏。比如说:

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实例。我可以将colorbar实例作为参数传递给update函数,但我认为只传递一个fig参数就足够了。有谁能解释一下如何从图中检索颜色条吗?或者为什么“fig.axes()”不返回AxesImage或Colobar实例,而只返回axes或AxesSubplot?我想我只是需要更多的理解斧头/图形的东西。谢谢!


Tags: 数据实例图像图形img颜色figupdate
2条回答

有时检索一个colorbar是有用的,即使它不是保存在一个变量中。

在这种情况下,可以使用以下命令从绘图中检索colorbar:

# Create an example image and colourbar
img = np.arange(20).reshape(5,4)
plt.imshow(img)
plt.colorbar()

# Get the current axis 
ax = plt.gca()        

# Get the images on an axis
im = ax.images        

# Assume colorbar was plotted last one plotted last
cb = im[-1].colorbar   

# Do any actions on the colorbar object (e.g. remove it)
cb.remove()

现在您可以对cb进行操作,就好像它是使用the colorbar API中描述的命令存储的一样。例如,您可以更改xlim或调用其他注释中解释的update。你可以用cb.remove()删除它,然后用plt.colorbar()重新创建它。

更新绘图后应调用plt.draw()show

因为图像是与颜色栏关联的可映射的,可以通过cb.mappable获得。

首先,我认为您在轴(基本上是绘图)、图形、标量可映射(在本例中是图像)和colorbar实例之间有点混淆。

figure是绘图所在的窗口。这是最上层的集装箱。

每个图形通常有一个或多个axes。这些是情节/子情节。

彩色条也在图中。添加颜色栏将为要在中显示的颜色栏创建一个新轴(除非另有指定)。(它通常不能与图像在同一个轴上显示,因为颜色条需要有自己的x和y限制等。)

您的一些困惑是因为您混合了状态机接口和OO接口。这样做很好,但是您需要理解OO接口。

fig.axes[1]不是colorbar实例。这是彩色条绘制的轴。(而且,fig.axes[1]只是图中的第二个轴。对于一个子块和一个颜色条的图形,它恰好是颜色条所在的轴,但通常情况下不是这样。)

如果要更新colorbar,则需要保留colorbar返回的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更新colorbar,则需要传入ScalarMappable(例如,由imshow创建的图像、由scatter创建的集合、由ContourSet创建的contour等)。(也有其他方法。通常,您只想更新限制,而不是全部内容。)对于上面的代码,您将调用cbar.update_normal(im)

但是,您没有创建新的AxesImage,您只是更改了它的数据。因此,您可能只想:

cbar.set_clim(newimg.min(), newimg.max())

相关问题 更多 >