Python 在matplotlib中实时打印,同时执行需要时间的测量

Python 在matplotlib中实时打印,同时执行需要时间的测量,python,live,ipython,matplotlib,Python,Live,Ipython,Matplotlib,我想在测量过程中进行测量并绘制图表 跑步在python中,这种测量需要相当长的时间(它必须通过慢速连接检索数据)。问题是测量时图形冻结。测量 包括设置中心波长,然后测量一些信号 我的程序如下所示: # this is just some arbitrary library that has the functions set_wavelength and # perform_measurement from measurement_module import set_wavelength, pe

我想在测量过程中进行测量并绘制图表 跑步在python中,这种测量需要相当长的时间(它必须通过慢速连接检索数据)。问题是测量时图形冻结。测量 包括设置中心波长,然后测量一些信号

我的程序如下所示:

# this is just some arbitrary library that has the functions set_wavelength and
# perform_measurement
from measurement_module import set_wavelength, perform_measurement
from pylab import *

xdata = np.linspace(600,1000,30) # this will be the x axis
ydata = np.zeros(len(xdata)) # this will be the y data. It will
for i in range(len(xdata)):
  # this call takes approx 1 s
  set_wavelength(xdata[i])
  # this takes approx 10 s
  ydata[i] = perform_measurement(xdata)
  # now I would like to plot the measured data
  plot(xdata,ydata)
  draw()
当它在IPython中运行且-pylab模块打开时,该功能将起作用, 但是,当测量运行时,数据将冻结。如何修改 测量时,是否有交互绘图的行为

您不能简单地使用pylab.ion(),因为python在执行测量时很忙

问候,


Dirk

您可以将数据收集作为一个独立的过程来运行,尽管可能有点笨拙。我发现在子流程模块中非常方便。然后让这个数据收集脚本将它所做的事情保存到某个磁盘上,然后您就可以使用它了

Popen.poll()
检查是否已完成


它应该可以工作。

我建议将数据缓冲成大块,并在缓冲区填满时进行渲染/重新渲染。如果你想让它是非阻塞的,看看greenlets

from gevent.greenlet import Greenlet
import copy
def render(buffer):
    '''
    do rendering stuff
    '''
    pass

buff = ''
while not_finished:
    buff = connection.read()
    g = Greenlet(render, copy.deepcopy(buff))
    g.start()

缓慢的输入和输出是在Python中使用线程和队列的最佳时机。线程有其局限性,但在这种情况下,它们可以轻松有效地工作

如何做到这一点的概述:

一般来说,GUI(例如matplotlib窗口)需要位于主线程中,数据采集也需要位于第二个线程中。在数据线程中,检查是否有新数据传入(如果在某种类型的无限轮询循环中执行此操作,请在短时间内执行。sleep偶尔释放线程)。然后,在需要时,让主线程知道有一些新数据需要处理/显示。具体操作方法取决于程序和GUI等的详细信息。您可以在数据线程中使用一个标志,从主线程检查该标志,或者使用一个ADING.Event,或者,例如,如果您有matplotlib wx.CallAfter的wx后端,则很容易。我建议您阅读众多Python线程教程中的一个来了解它,而且使用GUI进行线程处理通常也有一些问题,所以只需在特定后端上快速搜索线程。这听起来很麻烦,因为我简单地解释了一下,但它确实非常简单和强大,并且比从不同的进程读取和写入同一个文件更流畅。

看看和,Enthound的类型系统和绘图库。它们提供了一个很好的抽象来解决您遇到的问题。Chaco绘图将在其任何依赖项发生更改时自动更新

感谢您的回复,这很有帮助!我将编写一个测量程序,该程序可以使用Popen与绘图程序通信,并使用
Popen.communicate()
将测量数据发送回。这样我就可以为不同的程序重写测量程序,并且仍然使用相同的绘图程序。甚至可以使用插座,这样我可以在一台计算机上测量,并在另一台计算机上绘制结果。好的,这是我最初的想法,但你会怎么做呢?如果绘图在一个单独的线程中,它将不会有帮助,因为程序将在主线程中忙碌。你能给我举个例子吗?我在回答中给出了更详细的提纲。不过,这里要回答您的问题:关于“程序在主线程中会很忙”,因为您的数据采集受到硬件的限制,所以您的程序在数据采集线程中并不真正“忙”,它主要只是在等待数据。至少在我的经验中,线程在数据收集程序中几乎总是非常有效的。非常感谢!我会试试看,随时通知你。