Return 鼠标单击二维图的 x,y 值
Return x,y values of a 2D plot with mouse click
我正在绘制一个简单的图像,并希望获得 x、y 值,我用鼠标在此处单击。
from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
image = Image.open('points.jpg')
data = np.array(image)
plt.imshow(data)
plt.show()
因此,我可以将鼠标导航到每个点,单击并在最后获得一个包含 4 个 x,y 值的列表。
首先,对于要点击的图像,'png' 通常比 'jpg' 更合适。用于 'jpg' 颜色的压缩可能会弄脏颜色。
mplcursors
是一个支持点击(或悬停)绘图的小包。标准显示带有坐标的注释工具提示。在您的应用程序中显示注释工具提示似乎很有用。如果不是,您可以使用 sel.annotation.set_visible(False)
抑制该行为并仍然接收带有坐标的事件。
坐标有两种形式:x
和 y
使用轴的坐标系,或索引 (i,j)
来指示像素。使用 imshow
的 extent=
参数,您可以灵活地设置所需的范围(默认 x
和 y
从 0 到图像的宽度和高度)。每个像素中心的 x,y
是整数值。因此,您可以将 (i,j)
索引或 (x,y)
附加到列表中。
一些实验代码:
from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
import mplcursors
image = Image.open('points.png')
data = np.array(image)
img = plt.imshow(data)
points = []
cursor = mplcursors.cursor(img, hover=False)
@cursor.connect("add")
def cursor_clicked(sel):
# sel.annotation.set_visible(False)
sel.annotation.set_text(
f'Clicked on\nx: {sel.target[0]:.2f} y: {sel.target[1]:.2f}\nindex: {sel.target.index}')
points.append(sel.target.index)
print("Current list of points:", points)
plt.show()
print("Selected points:", points)
我正在绘制一个简单的图像,并希望获得 x、y 值,我用鼠标在此处单击。
from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
image = Image.open('points.jpg')
data = np.array(image)
plt.imshow(data)
plt.show()
因此,我可以将鼠标导航到每个点,单击并在最后获得一个包含 4 个 x,y 值的列表。
首先,对于要点击的图像,'png' 通常比 'jpg' 更合适。用于 'jpg' 颜色的压缩可能会弄脏颜色。
mplcursors
是一个支持点击(或悬停)绘图的小包。标准显示带有坐标的注释工具提示。在您的应用程序中显示注释工具提示似乎很有用。如果不是,您可以使用 sel.annotation.set_visible(False)
抑制该行为并仍然接收带有坐标的事件。
坐标有两种形式:x
和 y
使用轴的坐标系,或索引 (i,j)
来指示像素。使用 imshow
的 extent=
参数,您可以灵活地设置所需的范围(默认 x
和 y
从 0 到图像的宽度和高度)。每个像素中心的 x,y
是整数值。因此,您可以将 (i,j)
索引或 (x,y)
附加到列表中。
一些实验代码:
from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
import mplcursors
image = Image.open('points.png')
data = np.array(image)
img = plt.imshow(data)
points = []
cursor = mplcursors.cursor(img, hover=False)
@cursor.connect("add")
def cursor_clicked(sel):
# sel.annotation.set_visible(False)
sel.annotation.set_text(
f'Clicked on\nx: {sel.target[0]:.2f} y: {sel.target[1]:.2f}\nindex: {sel.target.index}')
points.append(sel.target.index)
print("Current list of points:", points)
plt.show()
print("Selected points:", points)