У меня проблемы с передачей данных из функции 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>