[英]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()
如果要在显示后保存图形,则需要保持图形实例。 调用show
后plt.savefig
不起作用的原因是当前数字已被重置。
pyplot
跟踪哪些数字,轴等在幕后是“当前”(即尚未与show
一起show
)。 gcf
和gca
获取当前的图形和当前轴实例。 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.