我一直在使用matplotlib示例页面中的这段代码。我试图让x轴维持一个给定的窗口。例如,画布将从x = 0到30,1到31,2到32进行绘制。现在我的x增长了。我还没能定义一个设置的窗口大小。任何人都可以指出我正确的方向。
从我的试验来看,无论x有什么价值,y都需要具有相同的长度。好吧,对于我的程序,我只想绘制一个串行数据流。我离开这条路了吗?
import time
import matplotlib
matplotlib.use('TkAgg') # do this before importing pylab
import matplotlib.pyplot as plt
import random
fig = plt.figure()
ax = fig.add_subplot(111)
y = []
def animate():
while(1):
data = random.random()
y.append(data)
x = range(len(y))
line, = ax.plot(y)
line.set_ydata(y)
fig.canvas.draw()
win = fig.canvas.manager.window
fig.canvas.manager.window.after(100, animate)
plt.show()
答案 0 :(得分:1)
您还可以更改x和y数据,然后更新绘图限制。我不知道你打算运行多长时间,但你应该考虑在某些时候转储不需要的y数据。
import matplotlib
matplotlib.use('TkAgg') # do this before importing pylab
import matplotlib.pyplot as plt
import random
fig = plt.figure()
ax = fig.add_subplot(111)
x = range(30)
y = [random.random() for i in x]
line, = ax.plot(x,y)
def animate(*args):
n = len(y)
for 1:
data = random.random()
y.append(data)
n += 1
line.set_data(range(n-30, n), y[-30:])
ax.set_xlim(n-31, n-1)
fig.canvas.draw()
fig.canvas.manager.window.after(100, animate)
plt.show()
答案 1 :(得分:0)
这是一个简单版本,它显示y的最后30个点(实际上它只丢弃除最后30个点之外的所有数据,因为它听起来你不需要存储它),但x轴标签保持不变在0-30永远,这可能不是你想要的:
def animate(y, x_window):
while(1):
data = random.random()
y.append(data)
if len(y)>x_window:
y = y[-x_window:]
x = range(len(y))
ax.clear()
line, = ax.plot(y)
line.set_ydata(y)
fig.canvas.draw()
fig = plt.figure()
ax = fig.add_subplot(111)
y = []
win = fig.canvas.manager.window
fig.canvas.manager.window.after(100, animate(y,30))
所以我添加了一个偏移变量来跟踪我们切断了多少y,并使用set_xticklabels将该数字添加到所有x轴标签:
def animate(y, x_window):
offset = 0
while(1):
data = random.random()
y.append(data)
if len(y)>x_window:
offset += 1
y = y[-x_window:]
x = range(len(y))
ax.clear()
line, = ax.plot(y)
line.set_ydata(y)
ax.set_xticklabels(ax.get_xticks()+offset)
fig.canvas.draw()
fig = plt.figure()
ax = fig.add_subplot(111)
y = []
win = fig.canvas.manager.window
fig.canvas.manager.window.after(100, animate(y,30))
这有用吗?