简体   繁体   中英

Dynamically updating plot (Funcanimation) in matplotlib

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: 示例 CSV 文件

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.

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)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM