使用Python创建动态更新图

时间:2011-04-11 08:23:47

标签: python dynamic graph

我需要你的帮助来编写一个Python脚本,它将采用动态变化的数据,这里的数据来源无关紧要,并在屏幕上显示图形。

我知道如何使用matplotlib,但matplotlib的问题是,我只能在脚本结尾处显示一次图形。我需要不仅能够一次显示图形,而且每次数据更改时都能动态更新图形。

我发现可以使用带有matplotlib的wxPython来实现这一点,但为我这样做有点复杂,因为我根本不熟悉wxPython。

所以如果有人向我展示如何使用带有matplotlib的wxPython来显示和更新简单图形的简单示例,我将非常高兴。 或者,如果是其他方式,这对我也有好处。

PS:
好的,因为没有人回答并查看了@janislaw注意到的matplotlib帮助,并编写了一些代码。这是一个虚拟的例子:


import time
import matplotlib.pyplot as plt


def data_gen():
    a=data_gen.a
    if a>10:
        data_gen.a=1
    data_gen.a=data_gen.a+1
    return range (a,a+10)

def run(*args):
    background = fig.canvas.copy_from_bbox(ax.bbox)

    while 1:
        time.sleep(0.1)
        # restore the clean slate background
        fig.canvas.restore_region(background)
        # update the data
        ydata = data_gen()
        xdata=range(len(ydata))

        line.set_data(xdata, ydata)

        # just draw the animated artist
        ax.draw_artist(line)
        # just redraw the axes rectangle
        fig.canvas.blit(ax.bbox)

data_gen.a=1
fig = plt.figure()
ax = fig.add_subplot(111)
line, = ax.plot([], [], animated=True)
ax.set_ylim(0, 20)
ax.set_xlim(0, 10)
ax.grid()

manager = plt.get_current_fig_manager()
manager.window.after(100, run)

plt.show()

此实现存在问题,例如,如果您尝试移动窗口,脚本会停止。但基本上可以使用它。

7 个答案:

答案 0 :(得分:2)

作为matplotlib的替代品,Chaco库提供了很好的图形功能,并且在某些方面更适合实时绘图。

查看一些屏幕截图here,特别是,请参阅以下示例:

Chaco拥有qt和wx的后端,所以它在大多数情况下都能很好地处理你的基础细节。

答案 1 :(得分:2)

这是我写的一个处理这个问题的类。它需要一个传递给它的matplotlib图并将其放在GUI窗口中。它在自己的线程中,即使你的程序繁忙也能保持响应。

import Tkinter
import threading
import matplotlib
import matplotlib.backends.backend_tkagg

class Plotter():
    def __init__(self,fig):
        self.root = Tkinter.Tk()
        self.root.state("zoomed")

        self.fig = fig
        t = threading.Thread(target=self.PlottingThread,args=(fig,))
        t.start()

    def PlottingThread(self,fig):     
        canvas = matplotlib.backends.backend_tkagg.FigureCanvasTkAgg(fig, master=self.root)
        canvas.show()
        canvas.get_tk_widget().pack(side=Tkinter.TOP, fill=Tkinter.BOTH, expand=1)

        toolbar = matplotlib.backends.backend_tkagg.NavigationToolbar2TkAgg(canvas, self.root)
        toolbar.update()
        canvas._tkcanvas.pack(side=Tkinter.TOP, fill=Tkinter.BOTH, expand=1)

        self.root.mainloop()

在你的代码中,你需要像这样初始化绘图仪:

import pylab
fig = matplotlib.pyplot.figure()
Plotter(fig)

然后你可以这样绘制:

fig.gca().clear()
fig.gca().plot([1,2,3],[4,5,6])
fig.canvas.draw()

答案 2 :(得分:1)

虽然不是基于离线GUI的程序,graphite可以从其自己的数据收集器(碳)中获取数据,并绘制将对实时数据做出反应的实时图表。

答案 3 :(得分:0)

而不是matplotlib.pyplot.show(),您可以使用matplotlib.pyplot.show(block=False)。此调用不会阻止程序进一步执行。

答案 4 :(得分:0)

动态情节的例子,秘密是在绘图时做暂停,这里我使用networkx:

    G.add_node(i,)
    G.add_edge(vertic[0],vertic[1],weight=0.2)
    print "ok"
    #pos=nx.random_layout(G)
    #pos = nx.spring_layout(G)
    #pos = nx.circular_layout(G)
    pos = nx.fruchterman_reingold_layout(G)

    nx.draw_networkx_nodes(G,pos,node_size=40)
    nx.draw_networkx_edges(G,pos,width=1.0)
    plt.axis('off') # supprimer les axes

    plt.pause(0.0001)
    plt.show()  # display

答案 5 :(得分:0)

这是一个重复的问题:Dynamic Chart in Python,我找到了最好的方法,你可以在这里查看我的答案:http://litaotao.github.io/dynamic-charts-matplotlib-alternative-ipython-notebook-python-drawing-js

bellow是截图:

enter image description here

答案 6 :(得分:0)

我需要创建一个随时间更新的图形。我想到的最方便的解决方案是每次创建一个新图形。问题是在创建第一个图形后,脚本将不会执行除非手动关闭窗口。 如下所示,通过打开交互模式避免了该问题

    for i in range(0,100): 
      fig1 = plt.figure(num=1,clear=True) # a figure is created with the id of 1
      createFigure(fig=fig1,id=1) # calls a function built by me which would insert data such that figure is 3d scatterplot
      plt.ion() # this turns the interactive mode on
      plt.show() # create the graph
      plt.pause(2) # pause the script for 2 seconds , the number of seconds here determine the time after that graph refreshes

这里有两点要注意

  1. 图形的id -如果更改图形的id,则每次都会创建一个新图形,但是如果相同,则相关图形将被更新。
  2. 暂停功能-在指定时间段内停止执行代码。如果不应用此图,图将几乎立即刷新