Python: график разного цвета фона фигуры для каждой строки вспомогательных участков - PullRequest
1 голос
/ 15 января 2020

У меня фигура 9 сибплотов (3 строки по 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()

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

1 Ответ

1 голос
/ 15 января 2020

как-то так?

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()

enter image description here

Код для matplotlib .__ версия __ <3.0 </strong>

Следующий код работает в более старой версии 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()

enter image description here

...