Как я могу получить несколько субплотов в matplotlib?

156

Я немного озадачен тем, как работает этот код:

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

Как работает фига, оси в этом случае? Что оно делает?

Также, почему бы этой работе не сделать то же самое:

fig = plt.figure()
axes = fig.subplots(nrows=2, ncols=2)
bugsyb
источник
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()

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

ImportanceOfBeingErnest
источник
4
Вместо того, чтобы у plot(x, y)меня был свой график, исходящий от определенной пользователем функции, которая создает график с помощью networkx. Как это использовать?
Сигур
Можно ли создать несколько вспомогательных участков без цикла for? Например, какое-нибудь векторизованное решение для построения нескольких столбцов данных на отдельных графиках? Это очень просто с ggplot в R, но кажется невозможным с Python.
user2739472
3
Вы можете уменьшить два цикла for в один, axn = ax.flatten()а затем for axes in axn: axes.plot(x,y)
wander95
@ wander95 СПАСИБО, что этот ответ не работает для col = 1 или row = 1 без вас
Гульзар
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
топор на самом деле массив NumPy. fig - это matplotlib.figure.Figureкласс, с помощью которого вы можете сделать много манипуляций с изображенной на чертеже фигурой. Например, вы можете добавить цветную полосу к конкретному участку, вы можете изменить цвет фона позади всех участков. Вы можете изменить расположение этих участков или добавить к ним новый маленький топор. предпочтительно, вы можете захотеть один главный заголовок для всех участков, которые могут быть получены с помощью fig.suptitle(title)метода. наконец, когда вы довольны сюжетом, вы можете сохранить его, используя fig.savefigметод. @Leevo
Халил Аль Хути
21
  • Вы также можете распаковать оси в вызове subplots

  • И установите, хотите ли вы делить оси 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

Возможно, вас заинтересует тот факт, что начиная с версии 2.1 для matplotlib, второй код из вопроса также работает нормально.

Из журнала изменений :

В классе Figure теперь есть метод subplots. В классе Figure теперь есть метод subplots (), который ведет себя так же, как pyplot.subplots (), но на существующей фигуре.

Пример:

import matplotlib.pyplot as plt

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

plt.show()
ImportanceOfBeingErnest
источник
Я получаю: AttributeError Traceback (последний вызов был последним) <ipython-input-168-ed25aa5255fa> в <module> () 2 3 fig = plt.figure () ----> 4 оси = fig.subplots (nrows = 2 , ncols = 2) AttributeError: у объекта 'Figure' нет атрибута 'subplots'
Ludo Schmidt
1
@LudoSchmidt В ответе говорится «по состоянию на matplotlib версии 2.1 ...»
ImportanceOfBeingErnest
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.

Дизиет Асахи
источник