Краткий ответ: используйте разумные координаты, чтобы расположить свои оси, то есть числа от 0 до 1, например,
fig.add_axes([0.1 ,0.2, 0.5, 0.5])
Полагаю, числа слишком велики.Число колеблется в диапазоне от 0 до 1. Поэтому, хотя, безусловно, есть случаи, когда вы можете добавить оси за пределы этого диапазона, например [-0.1,0.7,0.3,0.5]
, создание осей с координатой, в 200 раз превышающей высоту фигуры, не очень полезно.
Ну, «бесполезно» не означает, что должно произойти сбой.Так что, вероятно, происходит то, что вы пытаетесь показать эту фигуру на экране в версии, которая расширяет размер фигуры до содержания фигуры.Это может произойти по умолчанию в блокноте jupyter, где показан рисунок, сохраненный с помощью fig.savefig(..., bbox_inches="tight")
.Таким образом, принимая размер фигуры 10 на 10 дюймов, [10,200,50,50]
приводит к тому, что фигуру пытались сохранить с размерами 60 * 10 = 600 дюймов в ширину и 250 * 10 = 2500 дюймов в высоту.При dpi 72 это приводит к png изображению (43200 x 180000) пикселей.Похоже, это слишком много, чтобы обрабатывать его.
При запуске кода в виде скрипта (добавление fig.savefig(..., bbox_inches="tight")
) вы на самом деле получаете ошибку, используя обычный Agg
рендерер на основе
RuntimeError: Unknown exception in RendererAgg
, что означает, что рендерер не являетсяспособен производить фигуру.Я не уверен, почему в Ipython / Juypter такая ошибка не возникает.
Более полезное сообщение об ошибке показывается с помощью рендерера "cairo",
import matplotlib
matplotlib.use("Qt4Cairo")
import matplotlib.pyplot as plt
fig = plt.figure(figsize=(10,10))
fig = plt.figure(figsize=(10,10))
fig.add_axes([10,200,50,50])
fig.savefig("hugeaxesposition.png", bbox_inches="tight")
показывает
cairocffi.CairoError: cairo returned CAIRO_STATUS_INVALID_SIZE:
invalid value (typically too big) for the size of the input (surface, pattern, etc.)
Я бы согласился, что такая ошибка была бы более полезной с точки зрения пользователя, чем сбой.
Хотя причина отсутствия ошибок в IPython / Jupyter может быть интересной для дальнейшего изучения, она, конечно, не имеет высокого приоритета, поскольку matplotlib не предназначен для получения огромных фигур в любом случае.