【问题标题】:matplotlib.pyplot/pylab not updating figure while isinteractive(), using ipython -pylab [duplicate]matplotlib.pyplot/pylab在isinteractive()时不更新图形,使用ipython -pylab [重复]
【发布时间】:2010-04-08 23:25:43
【问题描述】:

有很多关于 matplotlib、pylab、pyplot、ipython 的问题,如果您厌倦了看到这个问题,我很抱歉。我会尽可能具体,因为我一直在查看人们的问题并查看 pyplot 和 pylab 的文档,但我仍然不确定我做错了什么。开启代码:

目标:每 0.5 秒绘制一个图形,并在调用 plot 命令后立即更新图形。

我的编码尝试如下(在 ipython -pylab 上运行):

import time ion() x=linspace(-1,1,51) plot(sin(x)) for i in range(10): plot([sin(i+j) for j in x]) #see ** print i time.sleep(1) print 'Done'

它正确地绘制每一行,但直到它退出 for 循环。我尝试通过将draw() 放在** 所在的位置来强制重绘,但这似乎也不起作用。理想情况下,我想让它简单地添加每一行,而不是完全重绘。但是,如果需要重绘,那很好。

解决问题的其他尝试:
ion() 之后,尝试添加hold(True) 无济于事。
尝试show()**
我在plotting lines without blocking execution 找到了与我正在尝试做的最接近的答案,但show() 没有做任何事情。

如果这是一个直截了当的请求,我深表歉意,我正在忽略一些如此明显的事情。对于它的价值,这是在我试图将 matlab 代码从类转换为一些 python 以供我自己使用时出现的。我一直在尝试转换的原始 matlab(已删除初始化)如下:


for i=1:time
    plot(u)
    hold on
    pause(.01)
    for j=2:n-1
        v(j)=u(j)-2*u(j-1)
    end
    v(1)= pi
    u=v
end

任何帮助,即使只是“查找 this_method”也会非常好,所以我至少可以缩小我的努力来弄清楚如何使用该方法。如果有更多有用的信息,请告诉我。

【问题讨论】:

标签: python matplotlib


【解决方案1】:
from pylab import *
import time
ion()
tstart = time.time()               # for profiling
x = arange(0,2*pi,0.01)            # x-array
line, = plot(x,sin(x))
for i in arange(1,200):
    line.set_ydata(sin(x+i/10.0))  # update the data
    draw()                         # redraw the canvas
    pause(0.01)
print 'FPS:' , 200/(time.time()-tstart)
ioff()
show()

######################### 以上对我很有效。我在win7操作系统下的pythonxy2.7.3的spyder编辑器中运行它。
请注意pause() 语句后跟draw() 后跟ioff()show()

【讨论】:

  • 在我添加暂停(语句)之前,没有什么对我有用(也在 win 7 上)。谢谢
【解决方案2】:

您链接的问题的第二个答案提供了答案:在每个plot() 之后调用draw() 使其立即出现;例如:

import time
ion()
x = linspace(-1,1,51)
plot(sin(x))
for i in range(10):
    plot([sin(i+j) for j in x])
    # make it appear immediately
    draw()
    time.sleep(1)

如果这不起作用...试试他们在此页面上的操作:http://www.scipy.org/Cookbook/Matplotlib/Animations

import time

ion()

tstart = time.time()               # for profiling
x = arange(0,2*pi,0.01)            # x-array
line, = plot(x,sin(x))
for i in arange(1,200):
    line.set_ydata(sin(x+i/10.0))  # update the data
    draw()                         # redraw the canvas

print 'FPS:' , 200/(time.time()-tstart)

页面提到line.set_ydata()函数是关键部分。

【讨论】:

  • 由于某种原因,这对我不起作用。我毫不怀疑这是对的,我只是不确定为什么它对我不起作用。第一个打印后,我看到一个空白窗口 10 秒;之后出现所有图表。但是 draw() 似乎并没有强制更新,直到它退出 for 循环。我刚刚开始(尝试)使用 matplotlib——这可能与我听说过的“后端”有关吗? (我不知道那是什么=/)
  • @NumberOverZero - 您使用的是什么平台? (Windows/Mac/Linux...)
  • 奇怪...它在 7 上对我有用。好的,我会用其他东西来更新答案。
  • 看起来很有希望,但没有这样的运气。大约77fps。之后我在主循环中暂停了一次,以查看它是否一次执行每个部分,每次使用“trashvar=raw_input(":")”暂停输入。同样的事情,在循环结束之前仍然是一个空白屏幕。
  • :( 很抱歉 - 这两种方法都适合我,我不知道发生了什么。
【解决方案3】:

在我的 Mac 上运行 ipython 时遇到了完全相同的问题。 (在运行雪豹的Macbook pro上思考python 2.7 32bit的分发)。

从工作的朋友那里得到了一个小费。使用以下参数从终端运行 ipython:

ipython -wthread -pylab

这对我有用。上面来自“Daniel G”的python代码运行正常,而之前它没有更新情节。

根据 ipython 文档:

[-gthread, -qthread, -q4thread, -wthread, -pylab:...] 他们提供 对 GTK、Qt(版本 3 和 4)和 WXPython 的线程支持 工具包,以及 matplotlib 库。

我不知道为什么这很重要,但它确实有效。

希望对您有所帮助, 实验室垃圾

【讨论】:

  • 这个 -wthread 标志为我修复了一个类似的问题,图形窗口在关闭时锁定。谢谢!
  • 很遗憾 -wthread 是 removed in ipython 0.11。有没有其他方法可以让它工作?
【解决方案4】:

请参阅answer 我在此处发布的类似问题。我只使用 GTKAgg 后端就可以毫无问题地生成您的动画。为此,您需要将此行添加到您的脚本中(我认为是在导入 pylab 之前):

matplotlib.use('GTkAgg')

并安装 PyGTK。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-09
    • 1970-01-01
    • 2012-05-26
    • 1970-01-01
    • 2013-01-11
    相关资源
    最近更新 更多