检索图中的所有颜色条

时间:2018-12-20 14:33:55

标签: python matplotlib colorbar

我正在尝试操纵图中包含的所有颜色栏实例。有fig.get_axes()可以获取轴列表,但是我找不到与颜色条类似的东西。

此答案https://stackoverflow.com/a/19817573/7042795仅适用于特殊情况,不适用于一般情况。

考虑此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()

如何从cbar1获取cbar2fig

我需要的是一个像这样的函数

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

cbars = get_colorbars(fig)

2 个答案:

答案 0 :(得分:0)

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

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, [])

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

答案 1 :(得分:0)

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

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]

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