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
相关产品推荐
相关产品推荐

