Dynamically updating plot (Funcanimation) in matplotlib

人盡茶涼 提交于 2021-02-11 14:44:13

问题


I am trying to do a dynamically updating plot in Matplotlib Python 3.x using Tkinter. It starts with displaying a file dialog for the user to select the .csv file.

Here's the example of the .csv file:

I want to plot each row then the plot is updated & plotting the next row.

Here's what I currently have:

plt.style.use('fivethirtyeight')

xs =[]
ys = []

csvFile = filedialog.askopenfile(mode='r', filetypes=(("CSV file", "*.csv"), ("All files", "*.*")), title="Select a  CSV file")
csvFile2 = pd.read_csv(csvFile, header=[2])

selectedColumn = csvFile2.iloc[0:, 3:]

selectedArray = selectedColumn.to_numpy()  # arrays


def animate():
    for row in selectedArray:
        plt.clf() #clear current figure
        plt.plot(row)
        plt.title('Plot')
        plt.xlabel('Radar No')
        plt.ylabel('Value')

        plt.ylim(0.2, 0.9)  # Keeping the y axis stays the same during the loop
        plt.draw()
        plt.pause(0.0078) #0.0078 if the frequency is 128Hz -- Idk about this one
        plt.show()
animate()

It does plot the numbers dynamically, but the fps is so slow, about 5 fps.

Therefore, I am looking for another method, Funcanimation, but I am not sure how to use it. Inside the variable Selectedarray is something like this:

[0.489377 0.481563 0.477656 ... 0.300366 0.294261 0.288156] [0.489866 0.48254 0.478633 ... 0.300855 0.294994 0.288645] [0.489377 0.481319 0.478144 ... 0.300122 0.293773 0.288156]

....

I believe using Funcanimation is faster and I could control the speed(?) Could anyone pls help.

Thank you.


回答1:


There's a way doing these things with the flush_events() method. I'll try to give a general answer here, may need to adapt a little bit for the specific data and needs. Also, consider using time.sleep() to control for the speed of figure update.

import pandas as pd
import matplotlib.pyplot as plt
import time

myarray = pd.read_excel("yourdata.xlsx", index_col=None)
fig, ax = plt.subplots(1)
i=0
for row in myarray.head().itertuples():
    print(row)
    if i == 0:
        line, = ax.plot(row)
    else:
        line.set_ydata(row)
    fig.canvas.draw()
    fig.canvas.flush_events()
    plt.show()
    i += 1
    time.sleep(0.5)


来源:https://stackoverflow.com/questions/62948418/dynamically-updating-plot-funcanimation-in-matplotlib

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!