【问题标题】:Matplotlib multiple lines on graphMatplotlib 图表上的多条线
【发布时间】:2014-11-27 14:53:13
【问题描述】:

我在将 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 的不同之处很奇怪。

感谢您的帮助。

【问题讨论】:

    标签: python matplotlib


    【解决方案1】:

    正如大卫所说,plt.show() 重置当前数字。但是,plt.savefig() 没有,因此您需要明确地重置它。 plt.clf()plt.figure() 是两个可以为您完成的功能。只需在plt.savefig 之后插入呼叫即可:

        plt.savefig(self.name + str(turn))
        plt.clf()
    

    【讨论】:

      【解决方案2】:

      如果要在显示后保存图形,则需要保留图形实例。调用showplt.savefig不起作用的原因是当前的数字已经被重置了。

      pyplot 在幕后跟踪哪些图形、轴等是“当前的”(即尚未与show 一起显示)。 gcfgca 分别获取当前图形和当前坐标区实例。 plt.savefig(以及基本上任何其他的pyplot 方法)只是做plt.gcf().savefig(...)。换句话说,获取当前图形实例并调用其savefig 方法。同样plt.plot 基本上是plt.gca().plot(...)

      在调用show 后,“当前”图形和轴的列表为空。

      一般来说,您最好直接使用图形和轴实例来绘制/保存/显示/等,而不是使用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')
      

      source

      【讨论】:

      • 再次查看您的问题后,我的答案可能完全无关紧要……我的大脑今晚无法正常工作;如果是这样,请相应地投票,我将删除我的答案。
      • 感谢您的帮助。但是,应该注意的是,按照您向我展示的方法,确实有效,但是,它使用了大量的 RAM。 (我正在做的事情接近 1Gb)。简单地使用 plt.clf() 来清除图形效率更高。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-04-02
      • 2017-02-24
      • 1970-01-01
      • 1970-01-01
      • 2021-01-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多