Crear dinámicas gráfico actualizado con Python

Necesito de su ayuda para escribir un script en Python que se llevará a cambiado de forma dinámica los datos, la fuente de datos no es cuestión aquí, y mostrar el gráfico en la pantalla.

Sé cómo utilizar matplotlib, pero el problema con matplotlib, que me puede mostrar el gráfico sólo una vez, al final de la secuencia de comandos. Tengo que ser capaz de, no solo para mostrar el gráfico de una hora, pero también de la actualización sobre la marcha, cada vez que cuando cambian los datos.

He encontrado que es posible el uso de wxPython con matplotlib para hacer esto, pero es un poco complicado para hacer esto por mí, porque no estoy familiarizado con wxPython en todo.

Así que voy a ser muy feliz si alguien me muestre ejemplo sencillo de cómo utilizar wxPython con matplotlib para mostrar y actualizar simple gráfico.
O, si es de alguna otra manera para hacer esto, va a ser bueno para mí también.

PS:

Aceptar, ya que nadie respondió, y miró matplotlib ayuda notado por @janislaw y escribió algo de código. Esto es algo ficticio ejemplo:


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

Esta aplicación tiene problemas, como el guión se detiene si usted tratando de mover la ventana. Pero básicamente se pueden utilizar.

  • Yo sólo estaba tratando de hacer esto hoy y se dio por vencido en matplotlib. Me acaba de instalarse en el envío de todos los datos a través de un socket a un proceso de script que hace todo el dibujo, pero que probablemente no es la respuesta que estabas esperando.
  • matplotlib es fácilmente integrable en cualquier GUI que te gusta, y no deben ser estáticos. Hay ejemplos en la docs – ver las interfaces de Usuario de la sección. También hay rasgos/traitsgui/chaco, tal vez más adecuado para este tipo de trabajo, pero requiere un cambio de paradigma, enlace
InformationsquelleAutor Alex | 2011-04-11

5 Kommentare

  1. 2

    Aquí es una clase que escribí que se ocupa de este problema. Se necesita un matplotlib figura que le pasa y lo coloca en una ventana de la GUI. Su en su propio hilo para que permanezca sensible, incluso cuando el programa está ocupado.

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

    En su código, usted necesita para inicializar el trazador gráfico como este:

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

    A continuación, se puede representar de esta manera:

    fig.gca().clear()
    fig.gca().plot([1,2,3],[4,5,6])
    fig.canvas.draw()
    • Yo no podía obtener su solución para el trabajo, ya que soy nuevo en Tkinter no estoy seguro de lo que está mal, sin embargo lo que he descubierto hasta ahora es que el mainloop no puede estar en un hilo.
  2. 2

    Como una alternativa a la matplotlib, el Chaco biblioteca proporciona buenas capacidades gráficas y, en cierta forma, más aptas para vivir trazado.

    Ver algunas capturas de pantalla aquí, y, en particular, véanse estos ejemplos:

    Chaco tiene motores de qt y wx, por lo que se encarga de los detalles subyacentes para usted más bien la mayoría del tiempo.

    • Enlace para la captura de pantalla ya no es trabajo.
    • Actualizado. Dicho esto, hay muchos nuevas bibliotecas en el ecosistema Python ya que esta respuesta: Bokeh, Altair, Holoviews, y otros.
  3. 0

    Lugar de matplotlib.pyplot.show() puedes usar matplotlib.pyplot.show(block=False). Esta llamada no se bloque el programa a ejecutar más.

  4. 0

    ejemplo de la dinámica de la trama , el secreto es hacer una pausa mientras que el trazado , aquí uso 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

    Tuve la necesidad de crear un gráfico que se actualiza con el tiempo. La más conveniente solución que se me ocurrió fue crear un gráfico nuevo cada vez. El problema fue que la script no se ejecuta después de que el primer gráfico se crea, a menos que la ventana se cierra manualmente.
    Cuestión de la que fue evitado por la de inflexión en el modo interactivo en como se muestra a continuación

        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

    Hay dos puntos importantes a destacar aquí

    1. de identificación de la figura – si el id de la figura se ha cambiado a un nuevo gráfico se crea a cada momento, pero si es la misma es relevante el gráfico se actualizará.
    2. función de pausa – esto detiene la ejecución de código para el período de tiempo especificado. Si esto no se aplica el gráfico se actualizará casi de inmediato

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea