Как я могу использовать MatPlotLib Animation и отправлять данные из l oop для сохранения и сохранения в csv? - PullRequest
0 голосов
/ 13 апреля 2020

У меня проблемы с передачей данных из функции data l oop, вызываемой FuncAnimation, и хранением данных в отдельном массиве, который я sh сохраню как CSV.

По сути, я хочу, чтобы функция анимации matplotlib непрерывно отображала данные, а когда я нажимала кнопку сохранения, также сохраняла данные в CSV-файл.

Ниже мой код. Если у вас есть идеи, пожалуйста, дайте мне знать. Я был бы очень признателен.

Спасибо.

    import numpy as np
    from matplotlib import pyplot as plt
    from matplotlib import animation
    from matplotlib.widgets import Button</p>

<code>import serial

inBuf = [0]*512 
t = np.linspace(0, 511, 512)
dataSubs = 1
dataBuf = [0]*512*dataSubs
dataFileName = "data_test_3.csv"

# First set up the figure, the axis, and the plot element we want to animate
fig = plt.figure(figsize=(20,10))
ax = plt.axes(xlim=(0, 511), ylim=(0, 65000))
line, = ax.plot([], [], lw=2)

class AnalogPlot:
    saveStatus = False
    sampleInput = serial.Serial("COM6", 256000, timeout = 5) 
    # initialization function: plot the background of each frame
    def init(self):
        self.line.set_data([], [])
        return line,

def saveData(self, saveStatus):
    self.saveStatus = not self.saveStatus
    print(self.saveStatus)

# animation function.  This is called sequentially
def dataLoop(self):
    for i in range(0,512):
        inBuf[i] = ((ord(self.sampleInput.read())) << 8) | ord(self.sampleInput.read())
    return inBuf,

def dataSet(self, analogData):
    self.analogData = self.dataLoop()
    line.set_data(t, self.analogData)
    return line,

def printData(self, data):
    self.data = self.dataLoop()
    print(self.data)

def serialClose(self, sampleInput):
    self.sampleInput.close()    
    print("Serial port has closed.")

#def saveSwitch(saveStatus):
##    saveStatus = not saveStatus
#    print(saveStatus)

callBack = AnalogPlot()    

anim = animation.FuncAnimation(fig, callBack.dataSet, interval=33, blit=True)

axPrint = plt.axes([0.81, 0.05, 0.1, 0.075])
buttonPrint = Button(axPrint, 'Print')
buttonPrint.on_clicked(callBack.printData)

axClose = plt.axes([0.7, 0.05, 0.1, 0.075])
buttonClose = Button(axClose, 'Close')
buttonClose.on_clicked(callBack.serialClose)

axSave = plt.axes([0.59, 0.05, 0.1, 0.075])
buttonSave = Button(axSave, 'Save')
buttonSave.on_clicked(callBack.saveData)

plt.show()
</code>

...