我對這里很陌生,請與我裸露。使用“顯示多邊形按鈕”,我在思想家畫布中生成了 2 個 Matplotlib 圖,包括一個多邊形圖和一個散點圖。我想要一個 2 個單獨的滑鼠拾取事件來從多邊形(藍色)和散點(橙色)獲取坐標。它們(拾取事件)似乎可以正常作業,但是當我嘗試同時運行這兩個事件時出現錯誤,因為 Matplotlib 選擇器事件會干擾其他事件。
我感謝您的幫助。代碼如下:
import numpy as np
import pandas as pd
from pandastable import Table
from shapely.geometry import Polygon
import matplotlib
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
from matplotlib.figure import Figure
import matplotlib.pyplot as plt
import tkinter as tk
from tkinter import ttk as ttk
matplotlib.use('TkAgg')
root = tk.Tk()
root.geometry('700x400')
root.state('zoomed')
df2 = pd.DataFrame({
'x': [0,100,100,-100,-100,0,],
'y': [0,0,500,500,0,0,],
})
df= pd.DataFrame()
frame = tk.Frame(root)
frame.place(x=500, y=500)
pt = Table(frame, dataframe=df, width=150,height=400)
pt.show()
class App():
def __init__(self, master):
self.master = master
self.points = []
self.pointSelect = None
self.dotSelect=None
# Frame
self.frame =tk.Frame(master, width=400, height =950,highlightbackground="blue", highlightthickness=5)
self.frame.place(x=10, y=40)
# button
self.button = tk.Button(self.frame,text = "Show Polygon", command=self.plot_section, width =15, height =2 )
self.button.place (x=30, y=150)
def plot_section(self):
pt.model.df = df2 # writing into pd data frame
pt.redraw()
poly_new=list(tuple(map(tuple,np.asarray(df2))))
print(poly_new)
polygon2 = Polygon(poly_new)
self.x,self.y = polygon2.exterior.xy
fig.clear()
ax=fig.add_subplot(111)
self.x2=(0,50)
self.y2=(110,110)
ax.plot(self.x,self.y, color ='blue',picker=True, pickradius=5)
ax.scatter(self.x2, self.y2, s=32, color ='orange',picker=True)
canvas.draw_idle()
print(pt.model.df)
def onpick(event):
thisline = event.artist
xdata = thisline.get_xdata()
ydata = thisline.get_ydata()
ind = event.ind
print(xdata[ind][0] )
self.points=[]
self.points.append([xdata[ind][0], ydata[ind][0]])
print('this point click on polygon', self.points)
def onpick2(event):
#This function is called whenever a point on the Tkinter Canvas is Clicked
index = event.ind
xy = event.artist.get_offsets()
print ('hi scatter',xy[index])
self.pointSelect=fig.canvas.mpl_connect('pick_event', onpick)
self.dotSelects=fig.canvas.mpl_connect('pick_event', onpick2)
fig = Figure(figsize=(8,6), dpi=100)
canvas = FigureCanvasTkAgg(fig, master=root)
canvas.draw()
canvas.get_tk_widget().pack(side=tk.RIGHT)
app = App(root)
root.mainloop()
錯誤訊息 1:(最近一次呼叫最后一次):檔案“C:\Users\xxx\Anaconda3\envs\pls\lib\site-packages\matplotlib\cbook_ init _.py”,第 287 行,處理中 func(*args , **kwargs) 檔案“C:\Users\xxx\AppData\Local\Temp\ipykernel_39168\1909536620.py”,第 77 行,onpick xdata = thisline.get_xdata() AttributeError: 'PathCollection' 物件沒有屬性 'get_xdata '
錯誤訊息 2:(最近一次呼叫最后一次):檔案“C:\Users\xxxxx\lib\site-packages\matplotlib\cbook_ init _.py”,第 287 行,正在處理 func(*args, **kwargs) 檔案“C:\Users\xxxx\AppData\Local\Temp\ipykernel_39168\1909536620.py”,第 89 行,onpick2 xy = event.artist.get_offsets() AttributeError: 'Line2D' 物件沒有屬性 'get_offsets'
uj5u.com熱心網友回復:
event不在乎你點擊了什么。當您單擊畫布上的物件時,它會運行這兩個功能。
并且不同的物件具有不同的功能,您應該檢查instance為event.artist單擊的物件運行正確的代碼。
def onpick(event):
print('onpick', event.artist)
if isinstance(event.artist, matplotlib.lines.Line2D):
thisline = event.artist
xdata = thisline.get_xdata()
ydata = thisline.get_ydata()
ind = event.ind
print(xdata[ind][0])
self.points = []
self.points.append([xdata[ind][0], ydata[ind][0]])
print('this point click on polygon', self.points)
def onpick2(event):
print('onpick2', event.artist)
if isinstance(event.artist, matplotlib.collections.PathCollection):
index = event.ind
xy = event.artist.get_offsets()
print ('hi scatter', xy[index])
您甚至可以將所有功能放在一個功能中。
def onpick(event):
print('onpick', event.artist)
if isinstance(event.artist, matplotlib.lines.Line2D):
thisline = event.artist
xdata = thisline.get_xdata()
ydata = thisline.get_ydata()
ind = event.ind
print(xdata[ind][0])
self.points = []
self.points.append([xdata[ind][0], ydata[ind][0]])
print('this point click on polygon', self.points)
if isinstance(event.artist, matplotlib.collections.PathCollection):
index = event.ind
xy = event.artist.get_offsets()
print ('hi scatter', xy[index])
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/504284.html
上一篇:回傳月份索引/數字而不是月份名稱
下一篇:Spring(三)——AOP
