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