簡體   English   中英

使用Tkinter在Matplotlib中獲取鼠標單擊的位置

[英]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.xdataevent.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.xdataevent.ydataevent.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM