Получить все цветные полосы на рисунке - PullRequest
0 голосов
/ 20 декабря 2018

Я пытаюсь манипулировать всеми экземплярами цветовой панели, содержащимися на рисунке.Существует 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 и cbar2 из fig?

Мне нужна такая функция, как:

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

cbars = get_colorbars(fig)

Ответы [ 2 ]

0 голосов
/ 21 декабря 2018

У вас не будет другого выбора, кроме как проверить каждый объект, представленный на рисунке, имеет ли он цветную полосу или нет.Это может выглядеть следующим образом:

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 или нескольких цветовых полос для одного и того же объекта;те не могут быть найдены.

0 голосов
/ 21 декабря 2018

Поскольку единственное место, в котором я уверен, что ссылки на цветовые панели сохраняются, является атрибутом художника, к которому они привязаны, лучшее решение, о котором я могу подумать, - это поиск всех художников по фигуре.Лучше всего сделать это рекурсивно:

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

У меня не было возможности протестировать этот код, но он должен по крайней мере указать вам правильное направление.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...