在 Matplotlib 中进行 Ising 模型模拟,最后我需要将图形导出为图像,并且每个图像都返回空白。我认为这与消息有关
TLDR:
plt.show()
之前plt.savefig()
强制您在保存之前关闭活动图形。
使用 matplotlib 时,您可以 在 2 个接口之间进行选择:
Axes
接口和 pyplot
接口。
Axes 接口是基于对象的、显式的,pyplot
接口是基于函数的、隐式的。
在这里,您将两者混合,创建
ax
并使用 Axes
接口(ax = plt.axes(...)
和 ax.plot(...)
)显式地在其上绘图,并使用 pyplot
接口(plt.ylabel(...)
, plt.savefig(...)
等)。
混合是可以的,但最好保持一致。
解决你的问题。
pyplot
接口是隐式的,这意味着它适用于最后一个活动图形和轴。因此,当您调用 plt.savefig()
时,它会搜索最后一个活动图形。但是,在此之前您调用了 plt.show()
,它会中断执行并显示图形。因此,当执行 plt.savefig()
时,意味着您关闭了图形,因此当时没有图形处于活动状态。
简而言之,您的特定问题可以通过删除行
plt.show()
或将其放在最后来解决。
但是,我建议您使用显式的
Axes
接口,这样您就不太容易出现此类错误。参见:
import numpy as np
import matplotlib.pyplot as plt
M = 1000
x = np.arange(0, M)
y = np.arange(0, M)
fig, ax = plt.subplots(figsize=(10, 4))
ax.plot(x, y, "r-")
ax.set_xlim(0, M)
ax.set_ylim(-400, 400)
ax.set_ylabel("Magnetism")
ax.set_xlabel("Steps")
fig.savefig("output_mplot.png")
fig.show()
注意:另外,
fig = plt.figure
可能应该是fig = plt.figure()