简体   繁体   中英

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, but I want to do this method using functions only in order to familiarize with python.

but with this method every time when I move my mouse, a new figure pops up and what I want to do is to replot on the same figure.

This is my 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 = []


def readDZT():
    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]
        fig1 = plt.figure()
        # clear plots
        plt.clf()
        # plot 2D map
        plt.imshow(Data, aspect='auto', cmap='bone')
        plt.connect('motion_notify_event', mouse_move)
        fig1.canvas.draw_idle()
        plt.show()

    else:
        messagebox.showwarning("WARNING", "You Have Been Selected a Different Format")


def mouse_move(event):
    x = event.xdata
    print(x)
    if len(Data) and x is not None:  # there is something to plot
        fig2 = plt.figure()
        plt.clf()
        x = int(x)
        plt.plot(xAxes, Data[x])
        fig2.canvas.draw_idle()
        plt.show()


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()

do you have any suggestion?

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)

def readDZT():
    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")


def mouse_move(event):
    x = event.xdata
    print(x)
    if len(Data) and x is not None:  # 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()    

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