【问题标题】:how to get a live updating graph line如何获得实时更新的图形线
【发布时间】:2012-08-01 11:16:35
【问题描述】:

我正在尝试创建一个程序,它读取一些随机生成的数据,xax 和 yax 列表,当它以动画方式读取它们时,它们会实时显示。代码如下:

from matplotlib.pylab import *
import time, random

ion()
xax = []
yax = []

axes
for j in range (0,20):
    xax.append(j)
    r = random.randrange(0, 20)
    yax.append(r)
maxx = max(xax)
maxy = max(yax)
print maxx, maxy
axis([0,maxx,0,maxy])
line, = plot(xax[0],yax[0])
draw()
for i in xax:
    print i, yax[i]
    line.set_ydata(yax[i])
    draw()

【问题讨论】:

  • 好的。那么问题是什么?您的代码是否按预期工作?如果没有,为什么不呢?
  • 图表上没有出现线条,我不确定为什么
  • 也许那应该放在你的问题中。无论如何,您对axes 的呼叫应替换为axes()。此外,line, = plot(xax[0],yax[0]) 线绘制的是一个点,而不是一条线,这可能就是你什么都看不到的原因。尝试将其替换为line, = plot(xax, yax)
  • 这解决了你所有的问题吗?如果是这样,我会把它变成一个答案。
  • 我想知道如何绘制线上的下一个点,此刻线只是在 y 轴上移动

标签: animation graph matplotlib live


【解决方案1】:

在 cmets 和chat 中对问题的讨论之后,尝试以下更新一行,为循环的每次迭代扩展它。原始代码中的问题是一次只绘制一个点,因此显然没有将线绘制到屏幕上。在下文中,我使用numpy.appendmatplotlib.pylab 的一部分)在循环的每次迭代中扩展 x 和 y 数据。

from matplotlib.pylab import *
import time, random

ion()

xax = range(0, 20)
yax = [random.randrange(0, 20) for _ range(0, 20)]

axes()

xlim(xmax=max(xax))
ylim(ymax=max(yax))

line, = plot(xax[0], yax[0])

for i, x in enumerate(xax):
    line.set_ydata(append(line.get_ydata(), yax[i]))
    line.set_xdata(append(line.get_xdata(), x))
    draw()
    time.sleep(1.)

【讨论】:

  • 在 xlim,ylim 位上,当我不断收到“无效语法”时,另一个 ']' 意味着去哪里?
  • 对其进行了排序,但出现 RuntimeError: xdata and ydata must be the same length
  • [s 是拼写错误。我忘记更新循环中的 x 坐标。它现在应该可以工作了。
  • 确实如此,太棒了,克里斯,你已经提供了惊人的帮助,所以 line.set_x/ydata(append(.. 创建一个列表,在其中选择下一个数据点?
  • 没问题。基本上,在这种情况下,append 获取已经绘制的任何内容的列表 (get_x/ydata),并将下一个要绘制的元素添加到该列表中,我们使用 line.setx/ydata 绘制。所以它不会创建一个列表,我们从get_x/ydata 获取列表并添加到它。希望这很清楚。如果您需要更多帮助,我们可以在聊天室中讨论。
猜你喜欢
  • 2011-09-12
  • 2022-06-17
  • 2014-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-26
  • 2013-05-02
相关资源
最近更新 更多