Каковы различия между add_axes и add_subplot?

В предыдущем ответе мне было рекомендовано использовать add_subplot вместо add_axes чтобы правильно показывать оси, но при поиске документации я не мог понять, когда и почему я должен использовать одну из этих функций.

Может ли кто-нибудь объяснить различия?

Ответ 1

Общие основания

Оба, add_axes и add_subplot добавляют оси к фигуре. Они оба возвращают объект (подкласс a) matplotlib.axes.Axes.

Однако механизм, который используется для добавления осей, существенно отличается.

add_axes

Сигнатура вызова add_axes - add_axes(rect), где rect - это список [x0, y0, width, height], обозначающий нижнюю левую точку новых осей на фигурах coodinates (x0,y0) и ее ширину и высоту. Таким образом, оси расположены в абсолютных координатах на холсте. Например.

fig = plt.figure()
ax = fig.add_axes([0,0,1,1])

помещает фигуру на холст точно такой же величины, как и сам холст.

add_subplot

Сигнатура вызова add_subplot напрямую не предоставляет возможность разместить оси в предварительно определенной позиции. Скорее, это позволяет указать, где должны располагаться оси в соответствии с сеткой подпунктов. Обычный и самый простой способ указать эту позицию - это 3-х целочисленная запись,

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

В этом примере новые оси создаются в первой позиции (1) в сетке из 2 строк и 3 столбцов. Для создания только одной оси будет использоваться add_subplot(111) (первый график на сетке 1 на 1). (В более новых версиях matplotlib add_subplot() 'также возможен без каких-либо аргументов.)

Преимущество этого метода в том, что matplotlib заботится о точном позиционировании. По умолчанию add_subplot(111) будет создавать оси, расположенные в [0.125,0.11,0.775,0.77] или аналогичные, что уже оставляет достаточно места вокруг осей для заголовка и меток (галочка). Однако эта позиция также может меняться в зависимости от других элементов графика, набора заголовков и т.д. Его также можно настроить с помощью pyplot.subplots_adjust(...) или pyplot.tight_layout().

В большинстве случаев add_subplot будет предпочтительным методом для создания осей для графиков на холсте. Только в тех случаях, когда точное позиционирование имеет значение, add_axes может быть полезным.

Пример

import matplotlib.pyplot as plt
plt.rcParams["figure.figsize"] = (5,3)

fig = plt.figure()
fig.add_subplot(241)
fig.add_subplot(242)
ax = fig.add_subplot(223)
ax.set_title("subplots")

fig.add_axes([0.77,.3,.2,.6])
ax2 =fig.add_axes([0.67,.5,.2,.3])
fig.add_axes([0.6,.1,.35,.3])
ax2.set_title("random axes")

plt.tight_layout()
plt.show()

enter image description here

Альтернативный

Самый простой способ получить один или несколько участков вместе с их маркерами - это plt.subplots(). Для одной оси используйте

fig, ax = plt.subplots()

или, если нужно больше участков,

fig, axes = plt.subplots(nrows=3, ncols=4)

Исходный вопрос

В начальном вопросе оси были размещены с использованием fig.add_axes([0,0,1,1]), так что он плотно прилегает к границам фигуры. Недостатком этого является, конечно, то, что галочки, метки, метки осей и заголовки обрезаются. Поэтому я предложил в одном из комментариев к ответу использовать fig.add_subplot, поскольку это автоматически предоставит достаточно места для этих элементов, и, если этого недостаточно, можно отрегулировать с помощью pyplot.subplots_adjust(...) или pyplot.tight_layout().