
本文介绍如何利用 seaborn 替代 matplotlib.pyplot 的 `df.plot.scatter()`,将数据框中第三列(如 `lloc_id`)作为颜色映射变量自动生成图例,实现更专业、更简洁的分类可视化。
在 Pandas 中直接调用 df.plot.scatter() 虽然便捷,但其对按类别着色并自动生成图例的支持有限——尤其当需要将非数值型分类列(如 'LLOC_ID')映射为颜色时,原生方法需手动编码、设置 colormap 和图例,过程繁琐且易出错。
推荐改用 Seaborn 的 sns.scatterplot(),它专为统计绘图设计,天然支持将任意列(包括字符串类型)作为 hue 参数,自动完成颜色映射、图例生成、图例标题与图例项标注,代码更简洁、语义更清晰。
以下为完整实现示例(基于您提供的数据结构):
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
# 假设 LOCA 已通过 AGS4.convert_to_numeric 加载
# df = pd.DataFrame(LOCA)
# 这里用示例数据复现您的表格
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
plt.figure(figsize=(6, 5))
sns.scatterplot(
data=df,
x='ISPT_MAIN',
y='ISPT_TOP',
hue='LLOC_ID', # 自动按 LLOC_ID 分组着色并生成图例
style='LLOC_ID', # 可选:同时用不同标记区分(增强可读性)
s=80 # 控制点大小
)
plt.gca().invert_yaxis() # 反转 Y 轴(保持与原逻辑一致)
plt.title('Scatter Plot Colored by LLOC_ID')
plt.tight_layout()
plt.show()⚠️ 注意事项:
- hue 参数支持数值型和类别型(object 或 category)列;若 LLOC_ID 为数值但实际是分类标签,请先转换:df['LLOC_ID'] = df['LLOC_ID'].astype('category');
- 若需自定义颜色,可传入 palette= 参数(如 palette='Set2' 或字典 {'BH01': 'red', 'BH02': 'blue'});
- sns.scatterplot() 默认不显示网格,如需添加可加 plt.grid(True, alpha=0.3);
- 避免混用 plt.scatter() 与 sns.scatterplot() —— 后者返回 Axes 对象,应统一用 plt.* 或 ax.* 控制样式。
总结:用 sns.scatterplot(data=df, x=..., y=..., hue='LLOC_ID') 替代 df.plot.scatter(...),不仅一行代码解决颜色+图例问题,还提升图表可访问性与专业度,是 Pandas 用户进阶可视化的标准实践。










