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

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

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

2 ответа

Решение

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

И то и другое, add_axes а также add_subplot добавить оси к фигуре. Они оба возвращают 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(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()

альтернатива

Самый простой способ получить один или несколько участков вместе с их ручками 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(),

Ответ @ImportanceOfBeingErnest великолепен.
Однако в этом контексте обычно нужно создать оси для сюжета и add_axes() слишком много накладных расходов.

Итак, одна уловка, как и в ответе @ImportanceOfBeingErnest, заключается в использовании add_subplot(111).
Еще более элегантной и простой альтернативой будет:

      hAx = plt.figure(figsize = (10, 10)).gca()

Если хочешь 3Dпроекции можно передать любое свойство осей. Например, projection:

      hAx = plt.figure(figsize = (16, 10)).gca(projection = '3d')
Другие вопросы по тегам