Как использовать несколько цветов фона для фигуры в Python?

Я просто хочу построить несколько наборов данных, скажем, 4, используя подфигуры, то есть что-то вроде

fig = figure(1)
ax1 = fig.add_subplot(221)
ax2 = fig.add_subplot(222)
ax3 = fig.add_subplot(223)
ax4 = fig.add_subplot(224)

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

Итак, я попытался определить две фигуры, одну с черным, а другую с белым фоном, добавив первые две подфигуры к рисунку 1, а другие к рисунку 2. В конце я объединил обе фигуры в PDF. но результаты были неудовлетворительными, так как файл PDF был беспорядочным, и две фигуры фактически выглядели как две разные, но не как одна фигура.

Дополнительно я попробовал что-то вроде

fig = figure(1) 
rect = fig.patch
rect.set_facecolor('black')
ax1 = fig.add_subplot(221)
ax2 = fig.add_subplot(222)
rect = fig.patch
rect.set_facecolor('white')
ax3 = fig.add_subplot(223)
ax4 = fig.add_subplot(224)

но, видимо, так не получится. Затем я попытался создать прямоугольник в качестве фона для каждой подфигуры, используя matplotlib.patches, что также кажется неуместным.

1 ответ

Решение

У меня была такая же проблема, и я нашел следующее решение:

import matplotlib.pyplot as plt
import matplotlib.patches as patches

fig = plt.figure(1)

# create rectangles for the background
upper_bg = patches.Rectangle((0, 0.5), width=1, height=0.5, 
                             transform=fig.transFigure,      # use figure coordinates
                             facecolor='gray',               # define color
                             edgecolor='none',               # remove edges
                             zorder=0)                       # send it to the background
lower_bg = patches.Rectangle((0, 0), width=1.0, height=0.5, 
                             transform=fig.transFigure,      # use figure coordinates
                             facecolor='white',              # define color
                             edgecolor='none',               # remove edges
                             zorder=0)                       # send it to the background

# add rectangles to the figure
fig.patches.extend([upper_bg, lower_bg])

# create subplots as usual
fig.add_subplot(221)
fig.add_subplot(222)
fig.add_subplot(223)
fig.add_subplot(224)

plt.show()

Обратите внимание, что вы должны явно установить zorder, потому что в противном случае патчи находятся перед вспомогательными участками. Полученная фигура выглядит следующим образом:

Результирующая фигура с двумя разными цветами фонариЭтот подход все еще опирается на matplotlib.patches и поэтому может быть не тот, который вы ищете, но я подумал, что это может быть полезно для других людей, имеющих эту проблему.

Более подробную информацию о манипулировании самой фигурой можно найти здесь: http://matplotlib.org/users/artists.html

Другие вопросы по тегам