内部循环更新图

时间:2016-07-19 14:18:14

标签: python python-2.7 matplotlib

我是Python matplotlib的新手,想要在循环中更新数字。 这是一些简单的测试代码。我想绘制3个图表,每个图表持续2秒,每次都有不同的斜率。当然,我知道我应该阅读更多关于matplotlib的内容,但我需要快速做一些事情。下面有什么问题?谢谢!

#!/usr/bin/env python

import matplotlib.pyplot as plt
import numpy as np
import time

def demo(a):
    y = [xt*a+1 for xt in x]
    ax.plot(x,y)

if __name__ == '__main__':
    plt.ion()
    fig, ax = plt.subplots()
    ax.set_ylim([0,15])
    x = range(0,5)
    for a in range(1,4):
        demo(a)
        time.sleep(2)

我认为plt.ion()使其互动并且ax.plot(x,y)立即生效(但不要猜测)。我尝试在ax.draw()之后添加ax.plot(x,y),但它需要一些像艺术家或我还不知道的东西:)。此外,我有这个错误消息(Ubuntu 14.04.LTS)。

Xlib:  extension "XInputExtension" missing on display ":1.0".
X Error: BadDrawable (invalid Pixmap or Window parameter) 9
  Major opcode: 62 (X_CopyArea)
  Resource id:  0x0

编辑:我在下面添加了正确的代码。 (根据Estilus的解决方案,我修改了一些正确的图形显示。

#!/usr/bin/env python

import matplotlib.pyplot as plt
import numpy as np
import time

def demo(a):
    plt.cla()
    y = [xt*a+1 for xt in x]
    ax.set_ylim([0,15])
    ax.plot(x,y)

if __name__ == '__main__':
    plt.ion()
    fig, ax = plt.subplots()
    x = range(5)
    for a in range(1,4):
        demo(a)
        plt.pause(3)
        plt.draw()

3 个答案:

答案 0 :(得分:3)

因此,plt.ion()需要暂停一小段时间才能实现交互。否则,你只会碰到一个冻结的白色屏幕。其次,您想使用draw()来更新图形。因此,您的代码看起来像这样:

import matplotlib.pyplot as plt
import numpy as np
import time

def demo(a):
    y = [xt*a+1 for xt in x]
    ax.plot(x,y)

if __name__ == '__main__':
    plt.ion()
    fig, ax = plt.subplots()
    ax.set_ylim([0,15])
    x = range(0,5)
    for a in range(1,4):
        demo(a)
        plt.pause(3)
        plt.draw()

我将暂停时间设置为3秒,但如果您愿意(例如0.000001)则可能是一个非常小的数字。希望这有帮助!

答案 1 :(得分:0)

您似乎正在尝试理解how to update a plot in matplotlib

您应该使用此代码了解如何使用[[Authorize]] public class TestController : ApiController { .... 更新图表数据:

fig1.canvas.draw()

答案 2 :(得分:0)

这是一个有效的代码。关键是:

  • plt.cla():清除每次抽奖之间的轴。如果要保留所有图表,请删除此行。
  • fig.canvas.draw():实际将情节绘制到图中的画布
#!/usr/bin/env python

import matplotlib.pyplot as plt
import numpy as np
import time

def demo(a):
    plt.cla()
    y = [xt*a+1 for xt in x]
    ax.set_ylim([0,200])
    ax.plot(x,y)
    fig.canvas.draw()

if __name__ == '__main__':
    plt.ion()
    fig, ax = plt.subplots()
    x = range(5)
    for a in range(40):
        demo(a)
        time.sleep(0.1)