Сбой ядра Python в записной книжке Jupyter при вызове fig.add_axes () - PullRequest
0 голосов
/ 04 октября 2018

Итак, у меня есть Anaconda в Windows, которая запускает среду с кучей вещей и:

  • Python 3.6.6
  • matplotlib 2.2.3

И когда я запускаю следующий код, мое ядро ​​Python падает:

import matplotlib.pyplot as plt

fig = plt.figure(figsize=(10,10))
fig = plt.figure(figsize=(10,10))
fig.add_axes([10,200,50,50])

Кто-нибудь знает, почему это происходит, или, возможно, может попытаться воспроизвести, чтобы я могзнаете, это не только мой компьютер умирает от меня?

Ответы [ 2 ]

0 голосов
/ 04 октября 2018

Краткий ответ: используйте разумные координаты, чтобы расположить свои оси, то есть числа от 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 не предназначен для получения огромных фигур в любом случае.

0 голосов
/ 04 октября 2018

Глядя на документацию Figure.add_axes , первый аргумент:

rect: последовательность с плавающей точкой

Размеры [слева, снизу,ширина, высота] новых осей.Все величины даны в долях ширины и высоты фигуры.

Значения являются долями высоты и ширины фигуры и должны быть в диапазоне от 0 до 1

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...