Python 调用 fig.add_axes() 时 Jupyter notebook 中的内核崩溃

Python kernel crash in Jupyter notebook when calling fig.add_axes()

所以我在 Windows 运行 环境中安装了 Anaconda,其中包含很多东西,并且:

当我 运行 下面的代码时,我的 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])

有谁知道为什么会发生这种情况,或者可以尝试重现,以便我知道这不仅仅是我的电脑死机了?

查看Figure.add_axes的文档,第一个参数是:

rect : sequence of float

The dimensions [left, bottom, width, height] of the new axes. All quantities are in fractions of figure width and height.

这些值是图形高度和宽度的分数,因此应介于 0 和 1 之间

简答:使用合理的坐标来放置轴,例如 0 到 1 之间的数字

fig.add_axes([0.1 ,0.2, 0.5, 0.5])

我想数字太大了。该数字介于 0 和 1 之间。因此,虽然在某些情况下您可能想要添加该范围之外的轴,例如[-0.1,0.7,0.3,0.5],在图形高度的 200 倍坐标处创建轴不是很有用。

嗯,"not useful" 并不意味着它应该崩溃。所以可能发生的情况是,您正试图在屏幕上 显示 这个图形,其版本将图形大小扩展到图形内容。这可能在 jupyter notebook 中默认发生,它显示了通过 fig.savefig(..., bbox_inches="tight") 保存的图形。因此,假设图形大小为 10 x 10 英寸,[10,200,50,50] 导致试图保存的图形尺寸为 60*10=600 英寸宽和 250*10=2500 英寸高。 dpi 为 72 时,这会生成 (43200 x 180000) 像素的 png 图像。这似乎要由渲染器处理太多。

当 运行 代码作为脚本(添加 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 并非设计用于产生巨大的数字。