使用Seaborn绘制DataFrame:索引为X轴、值为Y轴的散点图问题
问题描述
原始数据构建代码:
import pandas as pd import seaborn as sns df = pd.DataFrame({'Jim': {'ball': 5, 'bat': 8}, 'Nancy': {'ball': 9, 'bat': 10}}).T
需求:
- X轴显示Jim和Nancy
- Y轴显示1-10的数值
- 点按
bat和ball数据分色并附带图例
尝试的方法及问题:
- 循环列绘制:
for _, series in df.iteritems(): sns.scatterplot(x=df.index, y=series)
问题:Y轴标签固定为ball,无图例,效果不符合预期。
- 直接传入整个DataFrame:
sns.scatterplot(x=df.index, y=df, hue=df.columns)
问题:报错ValueError: Data must be 1-dimensional,Seaborn的y参数仅支持一维数据。
解决方案
Seaborn对**长格式(long-form)**数据的支持更好,需先转换数据结构再绘制:
1. 转换为长格式数据
用pandas.melt()重塑数据:
df_long = df.reset_index().melt(id_vars='index', var_name='item', value_name='count') df_long.columns = ['person', 'item', 'count'] # 重命名列,提升可读性
转换后的数据结构:
| person | item | count |
|---|---|---|
| Jim | ball | 5 |
| Nancy | ball | 9 |
| Jim | bat | 8 |
| Nancy | bat | 10 |
2. 绘制符合需求的散点图
基于长格式数据传入对应参数即可:
sns.scatterplot(data=df_long, x='person', y='count', hue='item')
此代码可实现:
- X轴显示Jim和Nancy
- Y轴展示1-10的数值范围
- 点按
bat/ball分色,自动生成对应图例
内容的提问来源于stack exchange,提问作者jss367
相关产品推荐
相关产品推荐

