2014-02-19 28 views
26

以下示例代码生成一个简单的图,然后将其保存为'fig1.pdf',然后将其显示,然后再次将其保存为'fig2.pdf ”。第一张图像看起来和预期一样,但第二张图像是空白的(包含一个白色正方形)。这里究竟发生了什么?行plt.show()显然弄乱了东西,但我无法弄清楚什么/如何!调用pyplot.show()后调用pyplot.show()将结果保存为空文件

import numpy as np 
import matplotlib.pyplot as plt 
x = np.linspace(-1, 1, 100) 
y = x**2 
plt.plot(x,y) 
plt.savefig('fig1.pdf') 
plt.show() 
plt.savefig('fig2.pdf') 

回答

36

之前,如果你想保存显示它后面的数字再次绘制它,你需要坚持图形实例。调用show之后plt.savefig不起作用的原因是当前数字已被重置。

pyplot跟踪哪些数字,轴等是“当前”(即尚未与show一起显示)的幕后。 gcfgca分别获取当前图形和当前轴实例。 plt.savefig(和基本上任何其他pyplot方法)只是plt.gcf().savefig(...)。换句话说,获取当前图形实例并调用它的savefig方法。同样plt.plot基本上是plt.gca().plot(...)

调用show后,“当前”图形和坐标轴列表为空。

一般来说,最好直接使用figure和axes实例来绘制/保存/显示/ etc,而不是使用plt.plot等来隐式地获取当前的图形/坐标轴和坐标图。使用pyplot(尤其是交互式)使用pyplot没有任何问题,但它可以让你更容易地在脚下拍摄自己。

对于plt.show()使用pyplot并生成图形和轴对象,但直接使用图形或轴方法。 (例如,ax.plot(x, y)而不是plt.plot(x, y)等)。这样做的主要优点是明确的。你知道你正在绘制什么对象,并且不必理解pyplot状态机的作用(尽管它也不难理解状态机接口)。

由于做事“推荐”的方式为例,做这样的事情:

import numpy as np 
import matplotlib.pyplot as plt 

x = np.linspace(-1, 1, 100) 
y = x**2 

fig, ax = plt.subplots() 
ax.plot(x, y) 
fig.savefig('fig1.pdf') 
plt.show() 
fig.savefig('fig2.pdf') 

如果你想用的pyplot接口的一切,然后就抓住数字实例调用show前。例如:

import numpy as np 
import matplotlib.pyplot as plt 

x = np.linspace(-1, 1, 100) 
y = x**2 

plt.plot(x, y) 
fig = plt.gcf() 
fig.savefig('fig1.pdf') 
plt.show() 
fig.savefig('fig2.pdf') 
+0

编辑nm,找出这是非交互式 – tacaswell

+1

+1,Joe。这,国际海事组织,说明为什么pyplot接口的使用应保持在最低限度。 –

3

pyplot.show块关闭并破坏情节。您可以使用

plt.show(block=False) 

之后,保存到fig2.pdf会工作,或者你可以节省

plt.plot(x,y) 
plt.savefig('fig2.pdf') 
+0

这不是什么'块'控制,它是值得的。 'block'控制gui工具包的主循环​​是否会阻止进一步的执行,或者在单独的线程中运行。 –

1

我绘制第二个之前运行plt.cla()plt.clf()。分别清除当前轴和清除当前绘图。

相关问题