plt.gcf() 不显示以前的情节实例

plt.gcf() doesn't show previous instance of a plot

我想将一个绘图实例保存到一个对象中,以便稍后只需调用该对象即可显示它。

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(0, 10, 0.1)
y1 = x
y2 = np.sin(x)

plt.plot(x, y1, linewidth=1, color = 'deepskyblue')
fig1 = plt.gcf()

plt.plot(x, y2, linewidth=1, color = 'red')
fig2 = plt.gcf()

在这个例子中,我首先画了一条蓝线 (y1=x) 并使用 plt.gcf() 将这个绘图的实例保存在 fig1 中。然后我在图中添加一条红色曲线 (y2=sin(x)) 并再次使用 plt.gcf() 将此图保存在 fig2 中。现在,我希望当我调用 fig1 时我只会得到蓝线,而当我调用 fig2 时我会得到两条线。像这样(我在 Jupyter 中):

fig1   # or fig1.show() if not in Jupyter

只有蓝色曲线

fig2 

两条曲线

但是,实际上,当我调用 fig1fig2 时,它们都显示两条曲线(如第二张图片)。有人可以帮助我如何正确获取每个图的实例,以便我以后可以随时显示它们吗?

您需要通过在代码中设置 plot.show() 来强制 matplotlib 实际绘制图形:

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(0, 10, 0.1)
y1 = x
y2 = np.sin(x)

plt.plot(x, y1, linewidth=1, color = 'deepskyblue')
plt.show()
fig1 = plt.gcf()

plt.plot(x, y2, linewidth=1, color = 'red')
plt.show()
fig2 = plt.gcf()

使用函数 plt.plot() 始终绘制到当前轴(如果不存在轴,则创建一个新轴)。 您还可以明确告诉 matplotlib 打开一个新图形:

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(0, 10, 0.1)
y1 = x
y2 = np.sin(x)

# open first figure
fig1 = plt.figure()
# plot
plt.plot(x, y1, linewidth=1, color = 'deepskyblue')

# open second figure
fig2 = plt.figure()
#plot
plt.plot(x, y2, linewidth=1, color = 'red')

虽然这已经解决了您的问题,但使用这样的面向对象版本被认为是一种很好的做法:

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(0, 10, 0.1)
y1 = x
y2 = np.sin(x)

# open first figure, axis
fig1, ax1 = plt.subplots()
# plot
ax1.plot(x, y1, linewidth=1, color = 'deepskyblue')

# open second figure, axis
fig2, ax2 = plt.subplots()
#plot
ax2.plot(x, y2, linewidth=1, color = 'red')

在所有情况下,您将获得:

现在,为什么在其他方法中不需要 plt.show()?嗯,matplotlib通过显式的新建一个figure/axis,很明显之前的坐标轴已经画完了,可以画了

最后一种方法是最清楚的,因为您可以准确地说出您正在考虑的是哪个图形和哪个轴。