无法在同一个图形 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()
首先我要感谢一位用户@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()