Почему во многих примерах используется fig, ax = plt.subplots() в Matplotlib/pyplot/python

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

fig, ax = plt.subplots()

Вот несколько примеров...

Я вижу, что эта функция используется много, хотя пример только пытается создать единый график. Есть ли еще какое-то преимущество? Официальная демонстрация для subplots() также использует f, ax = subplots при создании единого графика, и только после этого он ссылается только на ax. Это код, который они используют.

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

Ответ 1

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

fig, ax = plt.subplots()

более кратким, чем это:

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

Ответ 2

Просто добавьте сюда.

Следующий вопрос заключается в том, что, если я хочу, чтобы на рисунке фигурировали больше подзаголовков?

Как уже упоминалось в Доке, мы можем использовать 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() фактически возвращает кортеж с двумя элементами. Первый должен быть фигурным объектом, а другой должен представлять собой группу объектов подзаголовков.

Итак, попробуйте еще раз:

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)

Поэтому просто не забудьте сохранить конструкцию списка так же, как сетка подзаголовков, которую мы установили на рисунке.

Надеюсь, это будет полезно для вас.

Ответ 3

В дополнение к вопросу и ответам выше, есть также важное различие между 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)

Shared axes в то время как с plt.subplot() нужно будет указать индивидуально для каждой оси, что может стать громоздким.

Ответ 4

В дополнение к ответам выше, вы можете проверить тип объекта, используя type(plt.subplots()) который возвращает кортеж, с другой стороны, type(plt.subplot()) возвращает matplotlib.axes._subplots.AxesSubplot который Вы не можете распаковать.