我一直遇到将matplotlib图保存为图像的问题。 当我在图上调用.show()方法时,图像的保存方式与显示的图像不同。 这里有一个例子: http://s1.postimg.org/lbyei5cfz/blue5.png
我不知道还能做什么。我花了几个小时试图找出造成它的原因,但我无法弄明白。
这是我的完整代码。
import matplotlib.pyplot as plt
import random
turn = 1 #for the x values
class Graph():
def __init__(self, name, color):
self.currentValue = 5 #for the y values
self.x = [turn]
self.y = [self.currentValue]
self.name = name
self.color = color
def update(self):
if random.randint(0,1): #just to show if the graph's value goes up or down
self.currentValue += random.randint(0,10)
self.y.append(self.currentValue)
else:
self.currentValue -= random.randint(0,10)
self.y.append(self.currentValue)
self.x.append(turn)
def plot(self):
lines = plt.plot(self.x,self.y)
plt.setp(lines, 'color',self.color)
plt.savefig(self.name + str(turn))
#plt.show() will have a different result from plt.savefig(args)
graphs = [Graph("red",'r'),Graph("blue",'b'),Graph("green",'g')]
for i in range(5):
for i in graphs:
i.update() #changes the x and y value
i.plot() #saves the picture of the graph
turn += 1
很抱歉,如果这是我犯的一个愚蠢的错误,我发现plt.show()和plt.savefig有什么不同。
感谢您的帮助。
答案 0 :(得分:2)
如David所述,plt.show()
重置当前数字。但是,plt.savefig()
没有,因此您需要明确重置它。 plt.clf()
或plt.figure()
是两个可以帮助您的功能。只需在plt.savefig
之后插入通话:
plt.savefig(self.name + str(turn))
plt.clf()
答案 1 :(得分:1)
如果要在显示后保存图形,则需要保持图形实例。调用plt.savefig
后show
无法正常工作的原因是当前数字已重置。
pyplot
跟踪哪些数字,轴等是"当前" (即尚未与show
一起显示)幕后。 gcf
和gca
分别获取当前的数字和当前轴实例。 plt.savefig
(基本上是任何其他pyplot
方法)只是plt.gcf().savefig(...)
。换句话说,获取当前的图形实例并调用其savefig
方法。同样地,plt.plot
基本上是plt.gca().plot(...)
。
调用show
后,"当前&#34}的列表数字和轴是空的。
一般情况下,最好直接使用图形和轴实例绘制/保存/显示/等,而不是使用plt.plot
等来隐式获取当前图形/轴和绘图在上面。将pyplot
用于所有事情(尤其是交互式)并没有什么不妥,但它更容易让你自己陷入困境。
对pyplot
使用plt.show()
并生成图形和轴对象,然后直接使用图形或轴方法。 (例如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')