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

Matplotlib中Picker Event读取.loc筛选数据时显示异常求助

解决Matplotlib散点图点击事件的冗余输出与KeyError问题

问题原因

1. 冗余输出

直接打印ID[ind]、x[ind]会返回Pandas Series片段,而非单个值,因此附带索引、列名和数据类型等冗余信息。

2. KeyError报错

event.ind返回的是散点图中选中点的位置序号(从0开始),但筛选后的ID、x、y保留了原DataFrame的行索引,直接用ID[ind]会按原行索引取值,当位置序号不在原索引范围内时触发KeyError。

解决方案

使用.iloc[ind]按位置访问数据,提取标量值实现简洁输出;同时封装成通用函数,支持输入符合格式的DataFrame。

修改后的完整代码

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import random

def scatter_plot_with_click(df, category_val=0):
    # 筛选指定分类的数据并重置索引
    filtered_df = df[df['cat'] == category_val].reset_index(drop=True)
    x = filtered_df['x']
    y = filtered_df['y']
    ids = filtered_df['ID']
    
    # 点击事件处理函数
    def onpick(event):
        ind = event.ind[0]  # 取第一个选中点(支持多选可遍历ind)
        # 提取标量值并格式化输出
        current_id = ids.iloc[ind].item()
        current_x = x.iloc[ind].item()
        current_y = y.iloc[ind].item()
        print(f"ID: {current_id}, x: {current_x:.4f}, y: {current_y:.4f}")
    
    # 创建绘图
    fig, ax = plt.subplots(figsize=(8, 6), dpi=100)
    scatter = ax.scatter(x, y, c=ids, picker=True)
    
    # 图表配置
    ax.set_xlabel('x')
    ax.set_ylabel('y')
    unique_ids = np.unique(ids)
    ax.legend(*scatter.legend_elements(num=list(unique_ids)),
              loc="center left", 
              title='ID', 
              bbox_to_anchor=(1, 0.5),
              ncol=2
             )    
    ax.ticklabel_format(useOffset=False)
    ax.tick_params(axis='x', labelrotation=45)
    plt.tight_layout()
    
    # 绑定点击事件
    fig.canvas.mpl_connect('pick_event', onpick)
    plt.show()

# 生成测试数据
A = np.random.uniform(0, 100, 50)
B = np.random.uniform(0, 100, 50)
C = np.random.randint(0,25,50)
D = [0]*25 + [1]*25
random.shuffle(D)
df = pd.DataFrame({"x": A, "y": B, "ID": C, "cat": D})

# 调用通用函数
scatter_plot_with_click(df)

关键调整

  • 筛选后用reset_index(drop=True)重置索引,让位置序号与新索引一致,避免索引混淆
  • 用.iloc[ind]按位置访问数据,而非原行索引
  • 用.item()提取标量值,消除Series冗余输出
  • 封装为通用函数,支持传入DataFrame和指定分类值
  • 格式化输出为要求的简洁格式

内容的提问来源于stack exchange,提问作者Jack Arkmount

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 13:06:17