无法在同一个图形 MATPLOTLIB 上重新绘制图形

Can't replot a graph on the same figure MATPLOTLIB

首先我要感谢一位用户@j_4321,在这个问题上帮助了我很多

我很理解你的方法,但我想用函数来做这个方法只是为了熟悉python。

但每次移动鼠标时,使用此方法都会弹出一个新图形,我想做的是在同一个图形上重新绘制。

这是我的代码:

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

你有什么建议吗?

之所以每次移动鼠标都会弹出一个新图形,是因为移动鼠标会触发mouse_move(),而在这个函数中,你创建了一个新图形fig2 = plt.figure()

为避免这种情况,您可以在函数之外创建两个图形。但是,当您绘制图表时,您必须将 plt.imshow 替换为 ax1.imshow 并将 plt.plot 替换为 ax2.plot 以获得右图中的图表。而且 plt.clf() 必须替换为 ax1.clear()/ax2.clear().

最后,您可以从 mouse_move() 中删除 plt.show(),因为 matplotlib 事件循环已经是 运行(在 readDZT() 中调用)。只要显示绘图,对 plt.show() 的调用就会冻结 tkinter GUI,因此我还在 readDZT() 中添加了 root.update_idletasks() 以使消息框在启动 matplotlib 的事件循环之前消失。

完整代码如下:

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