Updating Plots in Matplotlib for Tkinter
You've encountered difficulties in updating plots in Matplotlib within a Tkinter application. You're allowing users to adjust the time scale units, which necessitates recalculating and updating the plot without creating new plots.
Approach 1: Clearing and Replotting
A straightforward method is to clear the existing plot by calling graph1.clear() and graph2.clear(), then replot the data. While it's simpler, it's also slower.
Approach 2: Updating Plot Data
An alternative approach, which is significantly faster, involves updating the data of existing plot objects. This requires adjusting your code slightly:
def plots(): global vlgaBuffSorted cntr() result = collections.defaultdict(list) for d in vlgaBuffSorted: result[d['event']].append(d) result_list = result.values() f = Figure() graph1 = f.add_subplot(211) graph2 = f.add_subplot(212, sharex=graph1) # Create plot objects vds_line, = graph1.plot([], [], 'bo', label='a') vgs_line, = graph1.plot([], [], 'rp', label='b') isub_line, = graph2.plot([], [], 'b-', label='c') for item in result_list: # Update plot data vds_line.set_data([], []) vgs_line.set_data([], []) isub_line.set_data([], []) tL = [] vgsL = [] vdsL = [] isubL = [] for dict in item: tL.append(dict['time']) vgsL.append(dict['vgs']) vdsL.append(dict['vds']) isubL.append(dict['isub']) # Update plot data vds_line.set_data(tL, vdsL) vgs_line.set_data(tL, vgsL) isub_line.set_data(tL, isubL) # Draw the plot f.canvas.draw() f.canvas.flush_events()
In this approach, you create plot objects (e.g., vds_line), then update their data with each iteration. The draw() and flush_events() methods are used to display the updated plot on the Tkinter window.
By choosing the appropriate approach, you can effectively update plots in Matplotlib within your Tkinter application.
The above is the detailed content of How Can I Efficiently Update Matplotlib Plots in a Tkinter Application After Changing the Time Scale?. For more information, please follow other related articles on the PHP Chinese website!