如果在尝试保存图像之前放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为空白。
答案 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")
在显示图形之后保存图形将是更自然的方法。