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 и се опитах да копирам кода, предложен от Diziet Asahi ред по ред. - person kirerik; 15.01.2020
comment
Каква версия на matplotlib? Очевидно е добавен 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