如何通过鼠标点击移除Matplotlib旧散点,仅保留最新散点
解决Matplotlib左键点击仅保留最新散点的问题
核心思路是保存每次创建的散点和文本对象,下次左键点击时先移除旧对象,再创建新的,避免重复叠加。具体修改如下:
- 定义变量存储旧的散点和文本元素,方便后续移除
- 左键点击时先清除旧元素,再生成新的散点和坐标文本
- 优化右键清除逻辑,把初始化图表元素的代码封装成函数,避免重复编写
修改后的完整代码:
import matplotlib.pyplot as plt fig, ax = plt.subplots(figsize=(10, 8)) # 存储旧的散点和文本对象 scatter_point = None text_label = None def init_plot(): """初始化图表元素的复用函数""" plt.cla() plt.grid(True) plt.xlabel('x') plt.ylabel('y') plt.title('Center Pin Coordinate') plt.text(825, 750, 'left button: mark') plt.text(825, 700, 'right button: import') ax.set(xlim=[0, 925], ylim=[0, 750]) ax.set_aspect('auto', adjustable='box') # 初始化图表 init_plot() def add_point(event): global scatter_point, text_label if event.inaxes != ax: return if event.button == 1: xdata = round(event.xdata, 1) ydata = round(event.ydata, 1) # 移除旧的散点和文本 if scatter_point is not None: scatter_point.remove() if text_label is not None: text_label.remove() # 创建新元素并保存对象 scatter_point = ax.scatter(xdata, ydata, c='red', edgecolors='black', s=200) text_label = ax.text(xdata, ydata, (xdata, ydata)) # 更新图表显示 fig.canvas.draw_idle() if event.button == 3: # 重置存储变量 scatter_point = None text_label = None # 重新初始化图表 init_plot() fig.canvas.draw_idle() cid = plt.connect('button_press_event', add_point) plt.show()
关键修改说明:
- 用
scatter_point和text_label记录每次创建的元素对象,通过remove()方法直接删除旧元素 - 改用
ax.scatter()和ax.text()关联当前坐标轴,避免全局绘图函数的混乱 - 用
fig.canvas.draw_idle()高效更新图表,替代重复调用plt.show() - 封装
init_plot()函数统一初始化逻辑,减少右键清除时的代码冗余
内容的提问来源于stack exchange,提问作者전영진
相关产品推荐
相关产品推荐

