Как передать аргументы в animation.FuncAnimation () для построения гистограммы на графике поверхности - PullRequest
0 голосов
/ 25 февраля 2019

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

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

# plot 3d bar chart on python using serial data
import matplotlib.pyplot as plt
import mpl_toolkits.mplot3d.axes3d as p3
import matplotlib.animation as animation
import serial
from matplotlib import style
import numpy as np

style.use('classic')
dataarrray = []
data = []
cnt = 0
arduinoData = serial.Serial('COM5', 9600)


def update_bars(num, bars):
    # print(data)
    for i in range(0, 16):
        bars[i] = ax.bar3d(xpos[i], ypos[i], zpos[i], dx[i], dy[i], dz[i])
    return bars


while True:
   while (arduinoData.inWaiting() == 0):  # Wait here until there is data
      pass
   arduinoString = arduinoData.readline().decode().strip('\r\n')
   temp = float(arduinoString)
   dataarrray.append(temp)
   cnt += 1
   data.clear()

   if(len(dataarrray) >= 17):
       data = dataarrray[0:16]
       del dataarrray[0:16]

   if(len(data) == 16):
       print(data)
       fig = plt.figure()
       ax = p3.Axes3D(fig)
       xpos = [1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4]
       ypos = [1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4]
       zpos = np.zeros(16)
       dx = np.ones(16)
       dy = np.ones(16)
       dz = data

    # add bars
       bars = []
       for i in range(16):
            bars.append(ax.bar3d(xpos[i], ypos[i],
                             zpos[i], dx[i], dy[i], dz[i]))
       ax.set_title('3D bars')

       ax.set_xlabel('x axis')
       ax.set_ylabel('y axis')
       ax.set_zlabel('z axis')

       line_ani = animation.FuncAnimation(fig, update_bars, 20, fargs=[
                             bars], interval=100, blit=False)
       plt.show()

plot image obtained

...