Як отримати декілька субплотів в matplotlib?


156

Я трохи розгублений, як працює цей код:

fig, axes = plt.subplots(nrows=2, ncols=2)
plt.show()

Як в цьому випадку діють смокини, оси? Що це робить?

Крім того, чому б не зробити це так само:

fig = plt.figure()
axes = fig.subplots(nrows=2, ncols=2)

1
Станом на Matplotlib 2.1 другий код робіт .
Парадокс Фермі

Відповіді:


210

Існує кілька способів зробити це. subplotsМетод створює фігуру поряд з подзаговор, які потім зберігаються в axмасиві. Наприклад:

import matplotlib.pyplot as plt

x = range(10)
y = range(10)

fig, ax = plt.subplots(nrows=2, ncols=2)

for row in ax:
    for col in row:
        col.plot(x, y)

plt.show()

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

Однак щось подібне також буде спрацьовувати, але це не так "чисто", хоча ви створюєте фігуру з субплотами і потім додаєте поверх них:

fig = plt.figure()

plt.subplot(2, 2, 1)
plt.plot(x, y)

plt.subplot(2, 2, 2)
plt.plot(x, y)

plt.subplot(2, 2, 3)
plt.plot(x, y)

plt.subplot(2, 2, 4)
plt.plot(x, y)

plt.show()

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


4
Замість цього у plot(x, y)мене є сюжет, що виходить із визначеної користувачем функції, яка створює графік з networkx. Як ним користуватися?
Сігур

Чи можливо виробляти декілька субплотів без фор-петлі? Наприклад, якесь векторне рішення для побудови кількох стовпців даних на окремих ділянках? Це дуже просто з ggplot в R, але здається неможливим з Python.
користувач2739472

3
ви можете зменшити дві петлі до однієї, axn = ax.flatten()а потім for axes in axn: axes.plot(x,y)
блукати95

@ wander95 ДЯКУЄМО, що ця відповідь не працює для col = 1 або row = 1 без вас
Gulzar

48
import matplotlib.pyplot as plt

fig, ax = plt.subplots(2, 2)

ax[0, 0].plot(range(10), 'r') #row=0, col=0
ax[1, 0].plot(range(10), 'b') #row=1, col=0
ax[0, 1].plot(range(10), 'g') #row=0, col=1
ax[1, 1].plot(range(10), 'k') #row=1, col=1
plt.show()

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


1
Я отримую те, що axє, але не те, що є fig. Хто вони?
Лієво

3
ax - це власне масивний масив. фіг - matplotlib.figure.Figureклас, за допомогою якого можна зробити багато маніпуляцій з накресленою фігурою. наприклад, ви можете додати кольорову панель до певної субплоти, ви можете змінити колір тла позаду всіх субпліт. ви можете змінити компонування цих підсплав або додати до них нову невелику сокиру. бажано, ви хочете отримати єдиний основний заголовок для всіх підплотів, які можна отримати fig.suptitle(title)методом. нарешті, коли ви задоволені сюжетом, можете зберегти його за допомогою fig.savefigметоду. @Leevo
Халил Аль Хуті

21
  • Ви також можете розпакувати осі під час виклику субплотів

  • І встановіть, чи хочете ви поділити осі x та y між підзагортами

Подобається це:

import matplotlib.pyplot as plt
fig, ((ax1, ax2), (ax3, ax4)) = plt.subplots(nrows=2, ncols=2, sharex=True, sharey=True)
ax1.plot(range(10), 'r')
ax2.plot(range(10), 'b')
ax3.plot(range(10), 'g')
ax4.plot(range(10), 'k')
plt.show()

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


14

Можливо, вас зацікавить той факт, що станом на matplotlib версії 2.1 другий код з питання також працює добре.

З журналу змін :

Тепер у класі рисунків є метод підзарядки. У класі "Клас" тепер є метод subplots (), який поводиться так само, як pyplot.subplots (), але на існуючому малюнку.

Приклад:

import matplotlib.pyplot as plt

fig = plt.figure()
axes = fig.subplots(nrows=2, ncols=2)

plt.show()

Я отримую: AttributeError Traceback (останній дзвінок останній) <ipython-input-168-ed25aa5255fa> в <module> () 2 3 fig = plt.figure () ----> 4 осі = fig.subplots (nrows = 2 , ncols = 2) AttributeError: 'Рисунок' об’єкта не має атрибута 'subplots'
Людо Шмідт,

1
@LudoSchmidt У відповіді сказано "станом на матплотліб версії 2.1 ..."
ВажливістьOfBeingErnest

11

читати документацію: matplotlib.pyplot.subplots

pyplot.subplots() повертає кортеж fig, ax , розпакований у дві змінні, використовуючи позначення

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

код

fig = plt.figure()
axes = fig.subplots(nrows=2, ncols=2)

не працює, тому що subplots()є функцією в pyplotне члені об'єкта Figure.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.