Python: график разных цветов фона рисунка для каждой строки подграфиков

У меня есть цифра 9 sibplots (3 строки x 3 столбца). Я хотел бы построить цвет фона фигуры (а не подзаголовки!) В другом цвете для каждой строки. Это то, что у меня есть до сих пор:

# Imports
import matplotlib.pyplot as plt
import numpy as np

# Plot the Figure

fig, axes = plt.subplots(nrows=3, ncols=3, figsize=(9, 9))

for r in np.arange(3):
    for c in np.arange(3):
        axes[r, c].plot(np.arange(10), np.random.randint(10, size=10))
        if r == 0:
            axes[r, c].patch.set_facecolor('azure')
        if r == 1:
            axes[r, c].patch.set_facecolor('hotpink')
        if r == 2:
            axes[r, c].patch.set_facecolor('lightyellow')
plt.show()

Эта цифра неверна в том смысле, что она окрашивает фон внутри каждого сюжета. Но я хочу, чтобы фон фигуры (вне подзаговоров) окрашивался по-разному для каждой строки. Как я могу это сделать?


person kirerik    schedule 15.01.2020    source источник
comment
Фигура имеет только один единственный фон. Поэтому, если вам нужны разные цвета, вам нужно создать несколько прямоугольников и разместить их на рисунке.   -  person ImportanceOfBeingErnest    schedule 15.01.2020
comment
Понимаю. Спасибо! Вы знаете, как я могу добавить три таких прямоугольника на рисунке за сюжетами?   -  person kirerik    schedule 15.01.2020


Ответы (1)


что-то вроде этого?

fig, axes = plt.subplots(nrows=3, ncols=3, figsize=(9, 9))

for r in np.arange(3):
    for c in np.arange(3):
        axes[r, c].plot(np.arange(10), np.random.randint(10, size=10))

colors = ['azure','hotpink','lightyellow']
for ax,color in zip(axes[:,0],colors):
    bbox = ax.get_position()
    rect = matplotlib.patches.Rectangle((0,bbox.y0),1,bbox.height, color=color, zorder=-1)
    fig.add_artist(rect)
plt.show()

введите здесь описание изображения

Код для matplotlib.__version__‹3.0

Следующий код работает в более старой версии matplotlib, где Figure.add_artist() не существует. Однако я обнаружил, что добавление прямоугольника к одной из осей вызывает проблемы с патчем фона этой оси, поэтому мне пришлось скрыть все фоны для согласованного вида.

import matplotlib.pyplot as plt
from matplotlib.patches import Rectangle
import numpy as np

fig, axes = plt.subplots(nrows=3, ncols=3)

for r in np.arange(3):
    for c in np.arange(3):
        axes[r, c].plot(np.arange(10), np.random.randint(10, size=10))

fig.tight_layout()

colors = ['azure','hotpink','lightyellow']
for ax,color in zip(axes[:,0],colors):
    bbox = ax.get_position()
    rect = Rectangle((0,bbox.y0),1,bbox.height, color=color, zorder=-1, transform=fig.transFigure, clip_on=False)
    ax.add_artist(rect)
for ax in axes.flat:
    ax.patch.set_visible(False)
plt.show()

введите здесь описание изображения

person Diziet Asahi    schedule 15.01.2020
comment
Спасибо! Это может работать, но я получаю сообщение об ошибке: AttributeError: объект «Рисунок» не имеет атрибута «add_artist». Вы знаете, как я могу обойти эту ошибку? - person kirerik; 15.01.2020
comment
Спасибо за ваше предложение @JohanC, но я не думаю, что это сработает, потому что тогда мы не рисуем цветные фоны/прямоугольники. - person kirerik; 15.01.2020
comment
@kirerik Приведенный выше код работает правильно для меня, используя fig.add_artist. Возможно, вы используете старую версию matplotlib, или, может быть, ваш код где-то перезаписал fig из plt.subplots. - person JohanC; 15.01.2020
comment
Я использую python 3.4 и пытался построчно скопировать код, предложенный Дизиет Асахи. - person kirerik; 15.01.2020
comment
Какая версия матплотлиба? Figure.add_artist() был добавлен в matplotlib 3.0, по-видимому. - person Diziet Asahi; 15.01.2020
comment
@kirerik Я добавил решение, которое работает без Figure.add_artist() - person Diziet Asahi; 16.01.2020
comment
Это идеально! Именно такого результата я и хотел. Большое спасибо! - person kirerik; 16.01.2020