Каковы различия между 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')