在matplotlib中调整实时绘图(串行数据流)的x轴范围

时间:2011-06-17 14:57:20

标签: python matplotlib

我一直在使用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()

2 个答案:

答案 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))

这有用吗?