Почему во многих примерах используется 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)
в то время как с plt.subplot()
нужно будет указать индивидуально для каждой оси, что может стать громоздким.
Ответ 4
В дополнение к ответам выше, вы можете проверить тип объекта, используя type(plt.subplots())
который возвращает кортеж, с другой стороны, type(plt.subplot())
возвращает matplotlib.axes._subplots.AxesSubplot
который Вы не можете распаковать.