Search code examples
pythonmatplotlibwxwidgets

Embedding a live updating matplotlib graph in wxpython


I am a newbie into wx python. The following is the code to plot live graph from a text file which can be updated live. Can anybody please help me to embed this code into a wx frame. I desperately need it for my project.

import matplotlib.pyplot as plt  
import matplotlib.animation as animation
import time

fig= plt.figure()
ax1=fig.add_subplot(1,1,1)

def animate(i):
    pullData= open('C:/test/e.txt','r').read()
    dataArray= pullData.split('\n')
    xar=[]
    yar=[]
    for eachLine in dataArray:
        if len(eachLine)>1:
            x,y= eachLine.split(',')
            xar.append(int(x)) 
            yar.append(int(y))
    ax1.clear()
    ax1.plot(xar,yar)
ani= animation.FuncAnimation(fig,animate, interval=1000)
plt.show()

Solution

  • Here I'll give you an example but you need to change the plotting part for your needs:

    import wx
    import numpy as np
    import matplotlib.figure as mfigure
    import matplotlib.animation as manim
    
    from matplotlib.backends.backend_wxagg import FigureCanvasWxAgg
    
    class MyFrame(wx.Frame):
        def __init__(self):
            super(MyFrame,self).__init__(None, wx.ID_ANY, size=(800, 600))
            self.fig = mfigure.Figure()
            self.ax = self.fig.add_subplot(111)
            self.canv = FigureCanvasWxAgg(self, wx.ID_ANY, self.fig)
            self.values = []
            self.animator = manim.FuncAnimation(self.fig,self.anim, interval=1000)
    
        def anim(self,i):
            if i%10 == 0:
                self.values = []
            else:
                self.values.append(np.random.rand())
            self.ax.clear()
            self.ax.set_xlim([0,10])
            self.ax.set_ylim([0,1])        
            return self.ax.plot(np.arange(1,i%10+1),self.values,'d-')
    
    
    wxa = wx.PySimpleApp()
    w = MyFrame()
    w.Show(True)
    wxa.MainLoop()