使用Python创建动态更新图

我需要你的帮助来编写一个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()
此实现有问题,如脚本停止,如果您尝试移动窗口。但基本上它可以使用。     
已邀请:
这是我写的一个处理这个问题的类。它需要一个传递给它的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()
    
作为matplotlib的替代品,Chaco库提供了很好的图形功能,并且在某些方面更适合实时绘图。 请参阅此处的一些屏幕截图,特别是请参阅以下示例: data_stream.py spectrum.py Chaco有qt和wx的后端,因此它在大多数情况下为你处理底层细节。     
虽然不是离线的基于GUI的程序,但石墨可以从其自己的数据收集器(碳)中获取数据,并绘制将对实时数据做出反应的实时图表。     
而不是
matplotlib.pyplot.show()
你可以使用
matplotlib.pyplot.show(block=False)
。此调用不会阻止程序进一步执行。     
动态情节的例子,秘密是在绘图时做一个暂停,这里我使用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
    
这是一个重复的问题:Python中的动态图表,我找到了最好的方法,你可以在这里查看我的答案:http://litaotao.github.io/dynamic-charts-matplotlib-alternative -ipython-笔记本蟒蛇拉-JS bellow是截图:     

要回复问题请先登录注册