Python 检索图中的所有颜色栏

Python 检索图中的所有颜色栏,python,matplotlib,colorbar,Python,Matplotlib,Colorbar,我正在尝试操作图形中包含的所有颜色条实例。有fig.get_axes()来获取轴列表,但我找不到任何类似的颜色条 这个答案只适用于特殊情况,而不适用于一般情况 以MWE为例: import matplotlib.pyplot as plt import numpy as np data = np.random.random((10,10)) # Generate some random data to plot fig, axs = plt.subplots(1,2) im1 = axs[

我正在尝试操作图形中包含的所有颜色条实例。有
fig.get_axes()
来获取轴列表,但我找不到任何类似的颜色条

这个答案只适用于特殊情况,而不适用于一般情况

以MWE为例:

import matplotlib.pyplot as plt
import numpy as np

data = np.random.random((10,10)) # Generate some random data to plot

fig, axs = plt.subplots(1,2)

im1 = axs[0].imshow(data)    
cbar1 = fig.colorbar(im1)

im2 = axs[1].imshow(2*data)    
cbar2 = fig.colorbar(im2)

fig.show()
如何从
fig
获取
cbar1
cbar2

我需要的是如下函数:

def get_colorbars(fig):
  cbars = fig.get_colorbars()
  return cbars

cbars = get_colorbars(fig)

由于我能合理确定颜色条引用被保留的唯一位置是作为它们所关联的艺术家的属性,因此我能想到的最佳解决方案是搜索图形中的所有艺术家。这最好是递归完成的:

def get_colorbars(fig):
    def check_kids(obj, bars):
        for child in obj.get_children():
            if isinstance(getattr(child, 'colorbar', None), Colorbar):
                bars.append(child.colorbar)
            check_kids(child, bars)
        return bars
     return check_kids(fig, [])

我还没有机会测试这段代码,但它至少应该为您指明正确的方向。

您别无选择,只能检查图中的每个对象是否有颜色条。这可能如下所示:

def get_colorbars(fig):
    cbs = []
    for ax in fig.axes:
        cbs.extend(ax.findobj(lambda obj: hasattr(obj, "colorbar") and obj.colorbar))
    return [a.colorbar for a in cbs]

这将为您提供与艺术家相关的所有色条。但图中可能有更多的色条,例如,直接从ScalarMapble创建的色条或同一对象的多个色条;那些是找不到的

当您使用
cbar1=fig.colorbar(im)
cbar2=fig.colorbar(im)
时,您已经这样做了。看答案perhaps@Bazingaa,
fig.colorbar(im)
创建一个colorbar,返回句柄,是的,但我需要从一个图中提取现有colorbar的句柄我澄清了我问题背后的意图如果你为同一个可映射(图像)创建两个colorbar,确实没有办法取回第一个,以防您尚未将句柄(
cbar1
此处)存储到它。当然,这引出了一个问题:为什么要为同一件事创建两个色条?@ImportanceOfBeingErnest mh,那么我的MWE不是很合适。我实际上打算解决的情况是,当使用不同的色阶和色条绘制多个对象时。让我更新我的MWE