Matplotlib的pyplot为何不允许您在显示图像后保存图像?

时间:2018-07-04 17:54:17

标签: python matplotlib

如果在尝试保存图像之前放pyplot.show(),则文件实际上不包含图像。

起初我以为这是一个错误,但是后来我切换了pyplot.show()pyplot.savefig('foo5.png')并成功了。

这是示例代码段。

def plot(embeddings, labels):
  assert embeddings.shape[0] >= len(labels), 'More labels than embeddings'
  pyplot.figure(figsize=(20, 20))  # in inches
  for i, label in enumerate(labels):
    x, y = embeddings[i,:]
    pyplot.scatter(x, y)
    pyplot.annotate(label, xy=(x, y), xytext=(5, 2), textcoords='offset points',
                   ha='right', va='bottom')
  pyplot.savefig('foo4.png')
  pyplot.show()
  pyplot.savefig('foo5.png')

books = [bookDictionary[i] for i in range(1, num_points2+1)]
plot(two_d_embeddings, books)
print( os.listdir() )

foo4.png很好,但是foo5.png为空白。

1 个答案:

答案 0 :(得分:3)

发现自己时,需要使用pyplot保存该数字,然后再将其保存为show n。

实际上,这仅适用于非交互模式(ioff),但这是默认的,并且可能是最常见的用例。

发生的事情是,一旦调用pyplot.show(),就会显示该图并启动事件循环,接管python偶数循环。因此,pyplot.show()之后的任何命令都将延迟到该图形关闭为止。这意味着pyplot.savefig()之后的show直到图形关闭后才执行。一旦数字被关闭,就不再存在要保存在pyplot状态机内部的数字。

但是,如果需要,您可以保存一个特定的数字。例如

import matplotlib.pyplot as plt

plt.plot([1,2,3])
fig = plt.gcf()
plt.show()
fig.savefig("foo5.png")

在这里,我们调用特定图形的savefig方法(在本例中为唯一存在的图形),我们需要获取该图形的句柄(fig)。

请注意,在这种情况下,您需要更好地控制matplotlib的工作方式,不使用pyplot而是主要依赖于面向对象的接口总是很有用的。 因此,

import matplotlib.pyplot as plt

fig, ax = plt.subplots()
ax.plot([1,2,3])
plt.show()
fig.savefig("foo5.png")

在显示图形之后保存图形将是更自然的方法。