所以我在 Windows 上安装了 Anaconda,运行一个包含很多东西的环境,并且:
- 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])
有谁知道为什么会发生这种情况,或者也许可以尝试重现,以便我知道这不仅仅是我的电脑死了?
最佳答案
简答:使用合理的坐标来放置轴,例如 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 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 无论如何都不是为了产生巨大的数字而设计的。
关于调用 Fig.add_axes() 时,Jupyter Notebook 中的 Python 内核崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52648036/