Создать динамический обновленный граф с Python - PullRequest
3 голосов
/ 11 апреля 2011

Мне нужна ваша помощь, чтобы написать скрипт на Python, который будет принимать динамически измененные данные, источник данных здесь не имеет значения, и отображать график на экране.

Я знаю, как использовать matplotlib, нопроблема с matplotlib, что я могу отображать график только один раз, в конце скрипта.Мне нужно иметь возможность не только отображать график один раз, но и обновлять его на лету, каждый раз, когда данные меняются.

Я обнаружил, что для этого можно использовать wxPython с matplotlib, но этонемного сложнее сделать это для меня, потому что я совсем не знаком с wxPython.

Так что я буду очень рад, если кто-нибудь покажет мне простой пример использования wxPython с matplotlib для отображения и обновления простого графика.Или, если это какой-то другой способ сделать это, мне тоже будет хорошо.

PS:
Хорошо, поскольку никто не ответил и не посмотрел на помощь matplotlib, замеченную @janislaw, и написал некоторый код,Вот какой-то фиктивный пример:


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

В этой реализации есть проблемы, такие как остановка скрипта, если вы пытаетесь переместить окно.Но в основном это можно использовать.

Ответы [ 6 ]

2 голосов
/ 20 июня 2012

Вот класс, который я написал, который обрабатывает эту проблему. Он берет фигуру matplotlib, которую вы передаете ей, и помещает ее в окно графического интерфейса. Он находится в своем собственном потоке, поэтому он остается отзывчивым, даже когда ваша программа занята.

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 голосов
/ 17 апреля 2011

В качестве альтернативы matplotlib библиотека Chaco предоставляет прекрасные графические возможности и в некоторых отношениях лучше подходит для построения графиков в реальном времени.

См. Некоторые скриншоты здесь и, в частности, смэти примеры:

У Chaco есть бэкэнды для qt и wx, поэтому большую часть времени он обрабатывает основные детали для вас.

1 голос
/ 17 апреля 2011

Хотя это не автономная программа на основе графического интерфейса пользователя, графит может брать данные из своего собственного сборщика данных (углерод) и строить графики в реальном времени, которые будут реагировать на живые данные.

0 голосов
/ 20 октября 2017

это своего рода повторный вопрос: Динамическая диаграмма в Python , и я нашел лучший способ сделать это, вы можете проверить мой ответ здесь: http://litaotao.github.io/dynamic-charts-matplotlib-alternative-ipython-notebook-python-drawing-js

ниже приведен скриншот:

enter image description here

0 голосов
/ 26 января 2017

пример динамического графика, секрет в том, чтобы сделать паузу при построении графика, здесь я использую сеть x:

    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
0 голосов
/ 12 апреля 2013

Вместо matplotlib.pyplot.show() вы можете просто использовать matplotlib.pyplot.show(block=False).Этот вызов не заблокирует выполнение программы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...