Чому багато прикладів використовують `fig, ax = plt.subplots ()` у Matplotlib / pyplot / python


265

Я вчусь використовувати matplotlib, вивчаючи приклади, і безліч прикладів, здається, включає такий рядок, як наступний, перш ніж створити єдиний сюжет ...

fig, ax = plt.subplots()

Ось кілька прикладів ...

Я бачу, що ця функція використовується багато, хоча приклад намагається створити єдину діаграму. Чи є якась інша перевага? Офіційна демонстрація for subplots()також використовується f, ax = subplotsпри створенні єдиної діаграми, і вона лише коли-небудь посилається на ось після цього. Це код, який вони використовують.

# Just a figure and one subplot
f, ax = plt.subplots()
ax.plot(x, y)
ax.set_title('Simple plot')

11
ну, він короткий, стислий, і ви отримуєте еталонну дві фігури та осі за один крок. Це віщий, тому що це красиво :)
чол

Відповіді:


323

plt.subplots()- це функція, яка повертає кортеж, що містить фігуру та осі (об'єкти). Таким чином, при використанні fig, ax = plt.subplots()ви розпакуйте цей кордон у змінні figта ax. Наявність figкорисно, якщо ви хочете змінити атрибути рівня фігури або зберегти фігуру як файл зображення пізніше (наприклад, за допомогою fig.savefig('yourfilename.png')). Вам, звичайно, не доведеться використовувати об'єкт, що повертається, але багато людей використовують його пізніше, тому це часто бачити. Крім того, всі об'єкти осей (об'єкти, які мають методи побудови графіків), так чи інакше, мають об'єкт батьківської фігури, таким чином:

fig, ax = plt.subplots()

є більш стислим, ніж це:

fig = plt.figure()
ax = fig.add_subplot(111)

8
Дуже хороше пояснення. Ось документ про нього - matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.subplots
bretcj7

2
Чому ми завжди використовуємо 111 як параметр у subplot?
Приянш

@Priyansh, тому що він успадкований від синтаксису Matlab
pcko1

@Priyansh Не завжди. Якщо ви хочете 4 графіки, ви можете мати ax11, ax12, ax21, ax22їх, використовуючи fig.add_subplot(221)(або 222, 223, 224 відповідно).
Гімуте

49

Просто доповнення тут.

Наступне питання полягає в тому, що що робити, якщо я хочу більше субплотів у фігурі?

Як було зазначено в Документі, ми можемо використовувати fig = plt.subplots(nrows=2, ncols=2)для встановлення групи підплотів з сіткою (2,2) в одному об’єкті фігури.

Тоді, як ми знаємо, fig, ax = plt.subplots()повертається кортеж, спробуємо fig, ax1, ax2, ax3, ax4 = plt.subplots(nrows=2, ncols=2)спочатку.

ValueError: not enough values to unpack (expected 4, got 2)

Це викликає помилку, але не хвилюйтесь, адже ми зараз бачимо, що plt.subplots()насправді повертається кортеж з двома елементами. 1-й повинен бути об'єктом фігури, а другий - групою об'єктів субплотів.

Тож спробуємо ще раз:

fig, [[ax1, ax2], [ax3, ax4]] = plt.subplots(nrows=2, ncols=2)

і перевірте тип:

type(fig) #<class 'matplotlib.figure.Figure'>
type(ax1) #<class 'matplotlib.axes._subplots.AxesSubplot'>

Звичайно, якщо ви використовуєте параметри як (nrows = 1, ncols = 4), то формат повинен бути таким:

fig, [ax1, ax2, ax3, ax4] = plt.subplots(nrows=1, ncols=4)

Тому просто пам’ятайте, щоб зберегти побудову списку такою ж, як і сітка субплотів, яку ми встановили на малюнку.

Сподіваюся, це буде корисно для вас.


2
не забудьте додати plt.tight_layout (), якщо у ваших субплотів є заголовки
gota

12
Що робити, якщо у вас багато субплотів? Простіше зробити це так: fig, axes = plt.subplots(nrows=10, ncols=3)і axes = axes.flatten(). Тепер ви можете звернутися до кожного подзаговор по його індексу: axes[0], axes[1], ...
Гійом

Що робити, якщо я хочу, щоб один із цих підскладів охоплював кілька знаків або рядків? це можна виконати за допомогою команди subplots?
Гот

1
@BallpointBen Я не впевнений, що це спрацьовує, якщо nrows=1після axesцього повертається плоскою довжиною, рівноюncols
Бен

1
@BallpointBen Щойно зрозумів, що можна виправити це, зробивши:fig, axes = plt.subplots(nrows=1, ncols=3, squeeze=False)
Бен

15

Окрім доповнення до запитання та вищезазначених відповідей, також існує важлива різниця між plt.subplots()і plt.subplot(), зауважте, пропущені 's'наприкінці.

Можна використовувати одразу plt.subplots()всі їх субплоти, і це повертає фігуру та осі (множину осі) підплотів як кортеж. Фігуру можна зрозуміти як полотно, де ви малюєте свій ескіз.

# create a subplot with 2 rows and 1 columns
fig, ax = plt.subplots(2,1)

Тоді як ви можете використовувати, plt.subplot()якщо ви хочете додати субплоти окремо. Він повертає лише вісь одного підплоту.

fig = plt.figure() # create the canvas for plotting
ax1 = plt.subplot(2,1,1) 
# (2,1,1) indicates total number of rows, columns, and figure number respectively
ax2 = plt.subplot(2,1,2)

Однак він plt.subplots()вважається кращим, оскільки він надає простіші варіанти безпосередньо налаштувати всю фігуру

# for example, sharing x-axis, y-axis for all subplots can be specified at once
fig, ax = plt.subplots(2,2, sharex=True, sharey=True)

Спільні оси тоді як, з plt.subplot(), потрібно буде окремо вказати для кожної осі, яка може стати громіздкою.


1
рядок коду ax3 = plt.subplot(2,1,3) не буде працювати, оскільки це 2 на 1, у якого є лише 2 графіки.
Хмара Чо

1
спасибі, виправили. В останньому блоці коду була потрібна ще одна зміна.
Light_B

3

Окрім наведених вище відповідей, ви можете перевірити тип об’єкта, за допомогою type(plt.subplots())якого повертається кортеж, з іншого боку, type(plt.subplot())повертається, matplotlib.axes._subplots.AxesSubplotякий ви не можете розпакувати.


4
Ласкаво просимо до переповнення стека! Це справді коментар, а не відповідь. З трохи більше представників ви зможете публікувати коментарі . Дякую!
Мирослав Гламузіна
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.