gpt4 book ai didi

python : Mouse click coordinates as simply as possible

转载 作者:行者123 更新时间:2023-11-28 21:09:56 30 4
gpt4 key购买 nike

我想编写一个交互式贝塞尔曲线生成器,唯一的输入是图形上的鼠标点击坐标(使用 matplotlib.pyplot)

因此,我想知道如何获取这些坐标以及如何使用 class 将它们堆叠在 x 轴和 y 轴的两个列表中。和 self.functions尽可能简单。

谢谢!

双模式

最佳答案

有一个 event在 matplotlib 中,单击绘图时会返回鼠标坐标。检查以下配方:

import numpy as np
import matplotlib.pyplot as plt

class LineBuilder:
def __init__(self, line,ax,color):
self.line = line
self.ax = ax
self.color = color
self.xs = []
self.ys = []
self.cid = line.figure.canvas.mpl_connect('button_press_event', self)
self.counter = 0
self.shape_counter = 0
self.shape = {}
self.precision = 10

def __call__(self, event):
if event.inaxes!=self.line.axes: return
if self.counter == 0:
self.xs.append(event.xdata)
self.ys.append(event.ydata)
if np.abs(event.xdata-self.xs[0])<=self.precision and np.abs(event.ydata-self.ys[0])<=self.precision and self.counter != 0:
self.xs.append(self.xs[0])
self.ys.append(self.ys[0])
self.ax.scatter(self.xs,self.ys,s=120,color=self.color)
self.ax.scatter(self.xs[0],self.ys[0],s=80,color='blue')
self.ax.plot(self.xs,self.ys,color=self.color)
self.line.figure.canvas.draw()
self.shape[self.shape_counter] = [self.xs,self.ys]
self.shape_counter = self.shape_counter + 1
self.xs = []
self.ys = []
self.counter = 0
else:
if self.counter != 0:
self.xs.append(event.xdata)
self.ys.append(event.ydata)
self.ax.scatter(self.xs,self.ys,s=120,color=self.color)
self.ax.plot(self.xs,self.ys,color=self.color)
self.line.figure.canvas.draw()
self.counter = self.counter + 1

def create_shape_on_image(data,cmap='jet'):
def change_shapes(shapes):
new_shapes = {}
for i in range(len(shapes)):
l = len(shapes[i][1])
new_shapes[i] = np.zeros((l,2),dtype='int')
for j in range(l):
new_shapes[i][j,0] = shapes[i][0][j]
new_shapes[i][j,1] = shapes[i][1][j]
return new_shapes
fig = plt.figure()
ax = fig.add_subplot(111)
ax.set_title('click to include shape markers (10 pixel precision to close the shape)')
line = ax.imshow(data)
ax.set_xlim(0,data[:,:,0].shape[1])
ax.set_ylim(0,data[:,:,0].shape[0])
linebuilder = LineBuilder(line,ax,'red')
plt.gca().invert_yaxis()
plt.show()
new_shapes = change_shapes(linebuilder.shape)
return new_shapes

img = np.zeros((100,100,3),dtype='uint')
shapes = create_shape_on_image(img)[0]
print(shapes)

它有点广泛(您也可以查看 matplotlib 示例之一)但它允许您直观地看到您单击的位置(您可以放置​​图像而不是背景的“黑色”numpy 数组).结果应该是这样的:

mouse click markers in matplotlib plot

最初它是为封闭的形状而制作的,但可以根据您的需要进行调整。关闭绘图后,您将获得实际坐标的 print:

[[54 13]
[19 39]
[19 77]
[58 78]
[93 45]
[90 11]
[54 13]]

如果您更喜欢从一些更普通的东西开始(一个简单的点击事件将坐标打印到控制台),请使用这个秘诀:

import matplotlib.pyplot as plt

def onclick(event):
print(event.xdata, event.ydata)

fig,ax = plt.subplots()
ax.plot(range(10))
fig.canvas.mpl_connect('button_press_event', onclick)
plt.show()

关于 python : Mouse click coordinates as simply as possible,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37363755/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com