Python Matplotlib图形上的多行

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.

我一直在将matplotlib图形保存为图像时遇到问题。 图像的保存方式与我在图形上调用.show()方法时显示的不同。 例如:

我不知道还能做什么。我花了几个小时试图找出是什么原因造成的,但我想不出来

这是我的全部代码

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()放在图中清除,效率会高得多。