Python Matplotlib图形上的多行
我一直在将matplotlib图形保存为图像时遇到问题。 图像的保存方式与我在图形上调用.show()方法时显示的不同。 例如: 我不知道还能做什么。我花了几个小时试图找出是什么原因造成的,但我想不出来 这是我的全部代码Python Matplotlib图形上的多行,python,matplotlib,Python,Matplotlib,我一直在将matplotlib图形保存为图像时遇到问题。 图像的保存方式与我在图形上调用.show()方法时显示的不同。 例如: 我不知道还能做什么。我花了几个小时试图找出是什么原因造成的,但我想不出来 这是我的全部代码 import matplotlib.pyplot as plt import random turn = 1 #for the x values class Graph(): def __init__(self, name, color): self.
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的不同很奇怪
谢谢您的帮助。如果您想在显示图形后保存它,您需要保留图形实例。调用
show
后,plt.savefig
无法工作的原因是当前图形已重置
pyplot
跟踪哪些图形、轴等在幕后是“当前的”(即尚未使用show
显示)gcf
和gca
分别获取当前图形和当前轴实例plt.savefig
(以及基本上任何其他pyplot
方法)只执行plt.gcf().savefig(…)
。换句话说,获取当前地物实例并调用其savefig
方法。类似地,plt.plot
基本上是plt.gca().plot(…)
调用show
后,“当前”图形和轴的列表为空
通常,最好直接使用figure和axes实例来打印/保存/显示/etc,而不是使用plt.plot
等隐式获取当前图形/轴并在其上打印。使用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
之前,只需抓取figure实例即可。例如:
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')
正如David正确指出的那样,
plt.show()
重置当前图形。plt.savefig()
,但不会重置,因此需要显式重置它。或者有两个功能可以为您实现这一点。只需在plt.savefig之后插入呼叫即可:
plt.savefig(self.name + str(turn))
plt.clf()
在再次回顾你的问题之后,我的答案可能完全不相关。。。今晚我的大脑不工作了;如果是的话,请投反对票,我将删除我的答案。谢谢你的帮助。然而,应该注意的是,你给我展示的方法确实有效,但是,它使用了大量的RAM。(对于我正在做的事情,接近1Gb)。简单地将plt.clf()放在图中清除,效率会高得多。