如何在Matplotlib的plt.scatter中为标记添加对应序号以实现手动按序选点?
如何在Matplotlib的plt.scatter中为标记添加对应序号以实现手动按序选点?
嗨,我明白你想要的效果啦——就是给每个红色十字标记加上对应的顺序编号,这样就能清楚看到每个点在列表里的位置,方便手动按序选点对吧?其实实现起来很简单,只需要在你现有的代码基础上,加一段遍历每个点并添加文本标注的逻辑就行,我来给你一步步说明:
基础实现:给已有坐标点添加序号
先修改你原本的代码,给每个scatter标记加上对应的序号:
import matplotlib.pyplot as plt import numpy as np img = plt.imread("image.png") x = np.random.rand(1, 20)*img.shape[1] y = np.random.rand(1, 20)*img.shape[0] size = 50 # 把形状为(1,20)的x、y转成一维数组,方便遍历每个点 x_flat = x.flatten() y_flat = y.flatten() plt.imshow(img, cmap="gray") # 绘制底层图像 plt.scatter(x_flat, y_flat, size, c="r", marker="+") # 绘制红色十字标记 # 遍历每个点,添加序号文本 for idx, (px, py) in enumerate(zip(x_flat, y_flat)): # 在点的右上方偏移一点的位置写序号,避免和标记重叠 # 偏移量可以根据你的图像大小自行调整 plt.text(px + 5, py + 5, str(idx+1), fontsize=10, color="blue") plt.show()
关键细节说明:
- 用
flatten()把原本二维的x、y数组转成一维,这样每个元素对应一个点的坐标,遍历起来更直观; enumerate会同时返回点的索引和坐标,索引加1就是我们要显示的序号(因为Python索引从0开始,而我们需要从1开始的编号);plt.text()用来在指定位置添加文本,这里给坐标加了5个像素的偏移,你可以根据图像的实际分辨率调整这个数值,确保序号和红色标记不重叠;- 还可以自定义文本的字体大小、颜色,比如我这里用了蓝色10号字体,让序号更醒目。
进阶:手动交互式选点并自动加序号
如果你需要的是手动点击图像选点,同时自动给每个点加上顺序序号,可以结合Matplotlib的ginput()函数实现,完全贴合你手动选点的需求:
import matplotlib.pyplot as plt import numpy as np img = plt.imread("image.png") size = 50 plt.imshow(img, cmap="gray") plt.title("点击图像选点,按回车键结束选点") # 手动选点,最多选20个(可以修改n的值调整最大选点数量) selected_points = plt.ginput(n=20) # 遍历选点结果,添加标记和序号 for idx, (px, py) in enumerate(selected_points): plt.scatter(px, py, size, c="r", marker="+") plt.text(px + 5, py + 5, str(idx+1), fontsize=10, color="blue") plt.show() # 还可以把选好的点坐标保存下来,方便后续使用 x_selected = np.array([p[0] for p in selected_points]) y_selected = np.array([p[1] for p in selected_points])
这样你就可以按自己需要的顺序点击图像上的点,程序会自动给每个点加上红色十字标记和对应的序号,最后还能把选点的坐标保存下来供后续处理~
备注:内容来源于stack exchange,提问作者100xln2
相关产品推荐
相关产品推荐

