You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过鼠标点击移除Matplotlib旧散点,仅保留最新散点

解决Matplotlib左键点击仅保留最新散点的问题

核心思路是保存每次创建的散点和文本对象,下次左键点击时先移除旧对象,再创建新的,避免重复叠加。具体修改如下:

  1. 定义变量存储旧的散点和文本元素,方便后续移除
  2. 左键点击时先清除旧元素,再生成新的散点和坐标文本
  3. 优化右键清除逻辑,把初始化图表元素的代码封装成函数,避免重复编写

修改后的完整代码:

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,提问作者전영진

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 21:23:37