Skip to content Skip to sidebar Skip to footer

Can't Replot A Graph On The Same Figure Matplotlib

First I want to thank a user @j_4321 that helps me a lot in this problem How to plot an automatic graph using mouse without clicking MATPLOTLIB. I really understand your method, bu

Solution 1:

The reason why a new figure pops up every time you move the mouse is because moving the mouse triggers mouse_move() and inside this function, you create a new figure with fig2 = plt.figure().

To avoid that, you can create both figures outside the functions. But then, when you plot the graphs, you have to replace plt.imshow by ax1.imshow and plt.plot by ax2.plot to get the graphs on the right figure. And also plt.clf() has to be replaced by ax1.clear()/ax2.clear().

Finally, you can remove the plt.show() from mouse_move() since matplotlib event loop is already running (called in readDZT()). The call to plt.show() freezes the tkinter GUI as long as the plots are displayed so I also added root.update_idletasks() in readDZT() to make the messagebox disappear before launching matplotlib's event loop.

Here is the full code:

import tkinter as tk
from tkinter import messagebox, filedialog
import pandas as pd
import matplotlib
import matplotlib.pyplot as plt
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2Tk
from matplotlib.figure import Figure
import numpy as np
import os
from readgssi import readgssi

# data
Data = []
xData = []
xAxes = []

# create plots
fig1 = plt.figure()
ax1 = fig1.add_subplot(111)
fig2 = plt.figure()
ax2 = fig2.add_subplot(111)

defreadDZT():
    global xAxes, Data
    file_path = filedialog.askopenfilename()
    file_name, file_extension = os.path.splitext(file_path)

    if file_extension == '.DZT':
        messagebox.showinfo("INFO", "Your DZT File Has Been Selected Successfully")
        hdr, arrs, gps = readgssi.readgssi(infile=file_path, verbose=True)

        Samples = hdr['rh_nsamp']

        X_Axes = np.array(range(0, Samples))
        xAxes = X_Axes[2::1]
        df = pd.DataFrame(arrs[0])
        Data = df.iloc[2::1, 0::1]
        # clear plots
        ax1.clear()
        ax2.clear()
        # plot 2D map in ax1
        ax1.imshow(Data, aspect='auto', cmap='bone')
        fig1.canvas.mpl_connect('motion_notify_event', mouse_move)
        fig1.canvas.draw_idle()
        fig2.canvas.draw_idle()
        # force update of tkinter GUI before launching matplotlib's event loop
        root.update_idletasks()
        plt.show()
    else:
        messagebox.showwarning("WARNING", "You Have Been Selected a Different Format")


defmouse_move(event):
    x = event.xdata
    print(x)
    iflen(Data) and x isnotNone:  # there is something to plot
        ax2.clear()  # clear second plot
        x = int(x)
        ax2.plot(xAxes, Data[x])  # plot slice in ax2
        fig2.canvas.draw_idle()

root = tk.Tk()
root.title("IHM")
root.geometry("1000x800")

Resources_frame = tk.LabelFrame(root, bd=2, relief=tk.GROOVE, text="Conversion Area")
Resources_frame.place(x=5, y=5, width=250, height=80)

tk.Label(Resources_frame, text="Select your File ").grid(row=0, column=0, sticky=tk.W)
tk.Label(Resources_frame, text="Convert Selected file ").grid(row=1, column=0, sticky=tk.W)

btn_rs = tk.Button(Resources_frame, relief=tk.GROOVE, padx=8, pady=1, text="Browse",
                   command=readDZT).grid(row=0, column=1)

root.mainloop()    

Post a Comment for "Can't Replot A Graph On The Same Figure Matplotlib"