繁体   English   中英

Matplotlib图上的多行

[英]Matplotlib multiple lines on graph

我一直遇到将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有什么不同。

谢谢您的帮助。

正如David所说, plt.show()重置当前数字。 但是, plt.savefig()没有,所以你需要显式重置它。 plt.clf()plt.figure()是两个可以做到这一点的函数。 只需在plt.savefig之后插入调用:

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

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

pyplot跟踪哪些数字,轴等在幕后是“当前”(即尚未与show一起show )。 gcfgca获取当前的图形和当前轴实例。 plt.savefig (基本上是任何其他pyplot方法)只是plt.gcf().savefig(...) 换句话说,获取当前的数字实例并调用其savefig方法。 类似地, plt.plot基本上是plt.gca().plot(...)

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

一般来说,最好直接使用图形和轴实例绘制/保存/显示/等,而不是使用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之前抓住图形实例。 例如:

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')

资源

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM