【问题标题】:update figure inside loop更新循环内的图形
【发布时间】:2016-11-22 12:01:24
【问题描述】:

我是 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.plot(x,y) 之后添加ax.draw(),但它需要一些参数,例如艺术家或我还不知道的东西:)。另外,我收到了这条错误消息(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()

【问题讨论】:

标签: python python-2.7 matplotlib


【解决方案1】:

所以 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)。希望这有帮助!

【讨论】:

  • 您好,这行得通。除了我将 ax.set_ylim([0,15]) 移到 demo() 内部。否则 ylim 设置不正确。谢谢!
【解决方案2】:

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

  • 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)

【讨论】:

  • 我完全按照你展示的那样做,但它给了我这个错误。 (也许与 python 无关)。除了几秒钟后短暂闪烁的数字窗口外,我看不到任何数字。 Xlib:显示“:1.0”上缺少扩展“XInputExtension”。 X 错误:BadDrawable(无效像素图或窗口参数)9 主要操作码:62 (X_CopyArea) 资源 ID:0x0
  • @ChanKim 这与 Python 无关。这是您的图形环境(虚拟机?)的问题
  • 我知道,所以我把你的代码复制到我的 CentOS6.7 机器上,但没有显示图片窗口。脚本仅在几秒钟后结束。有什么问题?你确定你修改后的代码在你的机器上运行正常吗?
【解决方案3】:

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

您应该使用此代码来了解如何使用fig1.canvas.draw() 来更新您的图表数据:

fig1 = figure()

for n in range(30):

    ## Clear the figure
    clf()

    # Do a plot that changes for each iteration
    plot(range(n))

    # Now set the xlimit so that it doesn’t change the plot
    xlim((0,30))
    ylim((0,30))

    ## Now the magic, we must update the canvas
    fig1.canvas.draw()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-21
    • 2020-12-02
    • 2021-06-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多