
本文介绍如何将 pandas dataframe 中的第三列(如类别标识 lloc_id)作为颜色映射变量,自动添加到散点图中并生成对应图例,推荐使用 seaborn 替代 matplotlib.pyplot 原生绘图以实现更简洁、语义清晰的可视化。
在使用 pandas.DataFrame.plot.scatter() 绘制基础散点图时,虽然能快速展示两维数值关系(如 ISPT_MAIN vs ISPT_TOP),但它不支持直接将第三列(如字符串型分类变量 LLOC_ID)映射为颜色并自动生成图例。若强行用 plt.scatter() 手动编码颜色映射,需额外处理类别编码、颜色分配和图例构建,代码冗长且易出错。
更专业、高效的解决方案是切换至 Seaborn 的 sns.scatterplot() —— 它专为统计绘图设计,原生支持将任意列(数值或类别型)通过 hue 参数映射为视觉属性(如颜色),并自动添加语义明确的图例。
以下为完整实现步骤(基于您提供的数据结构):
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
# 假设 LOCA 已加载(如 AGS4.convert_to_numeric(tables['ISPT']) 返回字典/列表)
# 构造示例 DataFrame(请替换为您的实际 df)
data = {
'LLOC_ID': ['BH02', 'BH01', 'BH01', 'BH04'],
'ISPT_TOP': [1.5, 1.0, 1.0, 2.5],
'ISPT_MAIN': [40, 50, 10, 12]
}
df = pd.DataFrame(data)
# ✅ 推荐:使用 seaborn.scatterplot + hue 实现自动着色与图例
plt.figure(figsize=(6, 5))
sns.scatterplot(
data=df,
x='ISPT_MAIN',
y='ISPT_TOP',
hue='LLOC_ID', # 关键:指定分类列作为颜色依据
style='LLOC_ID', # 可选:同时用不同标记区分(增强可访问性)
palette='Set2', # 可选:指定配色方案
s=80 # 控制点大小
)
plt.gca().invert_yaxis() # 保持原有 y 轴翻转需求
plt.title('Scatter Plot Colored by LLOC_ID')
plt.xlabel('ISPT_MAIN')
plt.ylabel('ISPT_TOP')
plt.legend(title='LLOC_ID') # 图例标题可定制
plt.tight_layout()
plt.show()⚠️ 注意事项:
- hue 参数会自动识别 LLOC_ID 为类别变量,并为每个唯一值分配不同颜色及图例项;
- 若 LLOC_ID 列含缺失值(NaN),Seaborn 默认将其归入单独图例项(可设 na_color='lightgray' 自定义);
- 避免混用 plt.scatter() 和 sns.scatterplot() 在同一子图中——前者无内置图例逻辑,易导致图例缺失或错位;
- 如需保留 pandas.plot 风格,也可用 df.plot.scatter(..., c=df['LLOC_ID'].astype('category').cat.codes) 手动编码,但需自行构造图例,远不如 Seaborn 简洁鲁棒。
总结:面对多维分类可视化需求,优先选用 sns.scatterplot(hue=...) 是最佳实践——它将数据语义(哪一列代表分组)、视觉编码(颜色/形状)与图形元素(图例)三者解耦又统一,大幅提升代码可读性与维护性。










