如何在matplotlib中翻译外部鼠标点击

时间:2011-12-21 18:11:21

标签: matplotlib cross-domain

在一台计算机中,我使用matplotlib生成一个图。生成绘图后,将其保存到文件中。该文件由matplotlib外部的另一个应用程序使用。生成的PNG文件显示给用户,用户通过单击图像文件进行交互。记录X,Y像素坐标并将其发送回使用matplotlib的Python程序,因此问题是我如何翻译这些像素坐标并确定用户在我的图表中单击的位置。

我一直试图找到的方法是确定原点的位置(以像素为单位),这样我就可以计算出图中的位置。例如,如果图像是100 X 100像素,我知道X和Y轴距图像边缘10个像素 - 原点是(10,10) - 我接到鼠标点击(80, 80)然后我会知道我的情节中的实际点击是(70,70)。到目前为止,我还没有找到任何可以在轴端给出任何参考的东西,并且实际的情节开始了。

1 个答案:

答案 0 :(得分:2)

看看transformation tutorial。在那里,它解释了如何将一个单位/引用帧中的点转换为另一个单位/帧。

以下是一些证明这一点的代码:

import matplotlib.pyplot as plt
import matplotlib.patches as patches

SCALE=1
MOUSE_CLICK = (80*SCALE,80*SCALE)

fig = plt.figure(figsize=(1*SCALE,1*SCALE),dpi=100) # 100x100
rect = [.1,.1,.8,.8]
ax = fig.add_axes(rect)
ax.plot(range(9),range(9))

# tranformations to help convert pixels to other units
fromPixelToFig = fig.transFigure.inverted()
fromPixelToData = ax.transData.inverted()

origin = ax.transData.transform((0,0))
print "origin in Pixels = ",origin
print "origin in Figure units = ",fromPixelToFig.transform(origin)

print "click in Pixels: ",MOUSE_CLICK
print "click in Figure Units: ",fromPixelToFig.transform(MOUSE_CLICK)
clickInData = fromPixelToData.transform(MOUSE_CLICK)
print "click in Data Units: ",clickInData

circ = patches.Circle(clickInData,radius=.25)
ax.add_patch(circ)

fig.savefig('mouseClick.png')

此脚本的输出为:

origin in Pixels =  [ 10.  10.]
origin in Figure units =  [ 0.1  0.1]
click in Pixels:  (80, 80)
click in Figure Units:  [ 0.8  0.8]
click in Data Units:  [ 7.  7.]

这导致以下(小)数字:

enter image description here

这是一个更大的例子(SCALE设置为4): enter image description here