使用 matplot lib 导出图像时出现问题

问题描述 投票:0回答:1

在 Matplotlib 中进行 Ising 模型模拟,最后我需要将图形导出为图像,并且每个图像都返回空白。我认为这与消息有关

但我不知道需要做什么来修复该消息或修复数字无法正确导出的问题。

这是创建绘图的代码。我查看了其他堆栈溢出帖子并尝试解决问题,例如手动添加轴或定义图形或确保所有内容都以正确的顺序定义,但似乎没有任何方法可以解决问题。

M = 1000
plot = np.zeros(M)
fig = plt.figure
ax = plt.axes(xlim=(0, M), ylim=(-400,400))

for x in range(M):
    plot[x] = x
    
xarr = range(0, M)
ax.plot(xarr, plot, 'r-')
plt.ylabel("Magnetism")
plt.xlabel("Steps")
plt.show()
plt.savefig("output_mplot.png")

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()

python image matplotlib plot
1个回答
0
投票

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()

© www.soinside.com 2019 - 2024. All rights reserved.