[英]Getting the location of a mouse click in Matplotlib using Tkinter
我正在嘗試在python中編寫一個簡單的GUI來顯示一個繪圖,然后允許用戶點擊某些關鍵特征(轉折點等),然后將其用作我正在開發的擬合算法的起點。
我發現以下帖子讓我開始; 使用matplotlib存儲鼠標單擊事件坐標
從計算機的角度來看,這似乎只給了我鼠標的像素位置。 我理想的是能夠到達工具欄右側的坐標並使用它們; 當matplotlib顯然已經為我做某事時,嘗試編寫我自己的pixel-> data轉換似乎是一種恥辱。
這是我到目前為止的代碼,如果看起來我正以錯誤的方式解決問題,請告訴我,我不能自豪地重新開始。
import matplotlib
matplotlib.use('TkAgg')
import Tkinter as tk
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2TkAgg
from matplotlib.backend_bases import MouseEvent
from matplotlib.figure import Figure
import numpy as np
def callback(event):
print "clicked at", event.x, event.y
root = tk.Tk()
f = Figure(figsize=(5,4), dpi=100)
a = f.add_subplot(111)
t = np.arange(0.0,3.0,0.01)
s = np.sin(2*np.pi*t)
a.plot(t,s)
canvas = FigureCanvasTkAgg(f, master=root)
canvas.show()
canvas.get_tk_widget().pack(side=tk.TOP, fill=tk.BOTH, expand=1)
canvas.mpl_connect('button_press_event',callback)
def callback(event):
print "clicked at", event.xdata, event.ydata
toolbar = NavigationToolbar2TkAgg( canvas, root )
toolbar.update()
canvas._tkcanvas.pack(side=tk.TOP, fill=tk.BOTH, expand=1)
toolbar
root.mainloop()
編輯:我沒有完全閱讀你的例子就跳了回答。 您遇到的問題是由於您已定義的順序。基本上,您有:
import matplotlib.pyplot as plt
def callback(event):
print event.x, event.y
fig, ax = plt.subplots()
fig.canvas.callbacks.connect('button_press_event', callback)
def callback(event):
print event.xdata, event.ydata
當您連接回調時,第二個函數尚未定義,因此它連接到具有相同名稱的早期函數。 在定義函數后移動回調連接,或者只是向上移動函數定義並刪除(未使用的)第一個回調函數。
無論如何,請看看matplotlib的變換,以了解如何在顯示/像素坐標和繪圖坐標之間進行轉換。 我會留下原來的答案,希望能幫助遇到這個問題的其他人。
如果我正確理解你,你想要鼠標點擊發生的數據坐標嗎?
如果是這樣,請使用event.xdata
和event.ydata
。
作為一個簡單的例子:
import matplotlib.pyplot as plt
def on_click(event):
if event.inaxes is not None:
print event.xdata, event.ydata
else:
print 'Clicked ouside axes bounds but inside plot window'
fig, ax = plt.subplots()
fig.canvas.callbacks.connect('button_press_event', on_click)
plt.show()
但是,一般來說, 看一下matplotlib的變換,用於在顯示,圖形,軸和數據坐標之間進行變換。
例如, event.xdata
和event.ydata
的event.xdata
event.ydata
:
x, y = event.inaxes.transData.inverted().transform((event.x, event.y))
它有點冗長,但ax.transData
是顯示(像素)坐標和數據坐標之間的轉換。 我們想要trans.inverted()
,所以我們用trans.inverted()
反轉變換。 Transform
處理不僅僅是點(通常你用它們來繪制另一個坐標系中的東西),所以要轉換一組點,我們需要調用transform
方法。
一開始看起來很麻煩,但它實際上相當優雅。 所有繪制的藝術家都采用transfom
論證來定義他們繪制的坐標系。這就是annotate
東西如何允許由數據坐標中另一個位置的點偏移定義的位置。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.