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

Win*_*ton 15 python matplotlib colorbar

所有.我想在imagedata更改时更新图形的颜色条.所以类似于:

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()
Run Code Online (Sandbox Code Playgroud)

但似乎fig.axes()的返回结果没有像我预期的颜色条实例.我可以将colorbar实例作为参数传递给更新函数,但我认为只传递一个fig参数可能就足够了.任何人都可以解释一下如何从图中检索颜色条?或者为什么'fig.axes()'不返回AxesImage或Colobar实例,只返回Axes或AxesSubplot?我想我只需要更多地了解Axes/Figure的东西.谢谢!

Vin*_*ooo 20

有时,即使它没有保存在变量中,检索颜色栏也很有用.在这种情况下,可以从图中检索颜色条:

# 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()
Run Code Online (Sandbox Code Playgroud)

现在您可以cb像存储一样进行操作,更改xlim或调用更新,如其他注释中所述.或者你可以删除它xlim并重新创建它cb.remove().

plt.colorbar()或者plt.draw()应该在更新情节后调用.

顺便说一下,图像是与颜色条相关联的可映射的,可以用show.

  • @DanielSank 我有同样的问题,但能够使用 `ax.collections[-1].colorbar` 代替 (11认同)
  • 在我的情况下,`ax.images`是一个空列表,即使那里有一个颜色条. (6认同)
  • ``ax.collections[-1].colorbar`` 也对我有用 - 通过 pandas 创建一个 hexbin。 (4认同)
  • 这个解决方案有什么问题(为什么是downvote)?这似乎完全回答了这个问题. (2认同)

Joe*_*ton 19

首先,我认为你在轴(基本上是情节),图形,标量可映射(在这种情况下是图像)和颜色条实例之间有点混淆.

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
Run Code Online (Sandbox Code Playgroud)

如果你要使用update_normal更新彩条,预计一ScalarMappable(通过创建例如图像imshow,该集合scatter创建时,ContourSetcontour创建等)以进行传递.(还有其他的方法来做到这一点,以及.通常你只想更新限制,而不是整个事情.)在上面的代码的情况下,你打电话cbar.update_normal(im).

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

cbar.set_clim(newimg.min(), newimg.max())
Run Code Online (Sandbox Code Playgroud)

  • 是的,制作完成后如何检索颜色条?假设我有绘制颜色条的轴,如何获得该颜色条? (3认同)
  • @DanielSank - 颜色条链接到它创建的艺术家,而不是特定的轴.如果您有艺术家(例如上面示例中的`im`),则颜色条将为"im.colorbar".当然,最好在创建颜色栏时直接保存对颜色栏的引用,但这并不总是可行的.无论如何,如果你使用`pyplot`接口,你可以使用`plt.gci().colorbar`来获取最近创建的颜色条.如果你不是,那么等效的是`fig._gci().colorbar`. (2认同)