如何在pandas.melt后添加原列顺序列并用于Seaborn可视化?
给Melt后的DataFrame添加列顺序标记(importance列)并用于Seaborn绘图
我来帮你搞定这个需求,其实关键是先提前定义好颜色的优先级映射,再同步到melt后的数据集里就行,步骤很清晰:
第一步:先确定排序后的列优先级
先把你用来排序列的结果存成变量,方便后续复用:
import pandas as pd import seaborn as sns # 你的原始车辆数据DataFrame df = pd.DataFrame( [{'Orange': 0, 'Green': 2, 'Blue': 1}, {'Orange': 2, 'Green': 4, 'Blue': 4}, {'Orange': 1, 'Green': 3, 'Blue': 10} ]) # 获取按最大值降序排列的颜色列名 sorted_color_cols = df.max().sort_values(ascending=False).index
第二步:创建颜色到importance的映射字典
用枚举方式给每个排序后的颜色分配优先级数值(0代表最高优先级):
color_importance_map = {color: idx for idx, color in enumerate(sorted_color_cols)} # 这个字典的结果是:{'Blue': 0, 'Green': 1, 'Orange': 2}
第三步:Melt并添加importance列
执行melt操作后,直接用map方法把颜色映射成对应的优先级:
tidy = pd.melt(df.reset_index(), id_vars=['index'], var_name='color', value_name='number') # 新增importance列 tidy['importance'] = tidy['color'].map(color_importance_map)
这样得到的tidy就完全符合你想要的格式,每个颜色对应的importance值和原排序后的列顺序一致。
结合Seaborn绘图的实用示例
有了importance列,你可以用它来突出高优先级的类别,这里给你几个常见的用法:
1. 让高优先级的线条更粗
把importance反向后作为线条粗细参数,数值越小(优先级越高)的线条越粗:
# 计算线条粗细:优先级最高的Blue用4px,Green用3px,Orange用2px tidy['line_weight'] = 4 - tidy['importance'] axes = sns.relplot( data=tidy, x='index', y='number', hue='color', kind="line", linewidth=tidy['line_weight'] )
2. 按importance拆分独立图表
如果想把不同优先级的类别分开展示,可以用col参数指定拆分维度:
axes = sns.relplot( data=tidy, x='index', y='number', hue='color', kind="line", col='importance', col_wrap=2 # 控制每行显示2个图表 )
3. 用颜色深浅区分优先级
自定义调色板,让高优先级的颜色更醒目:
# 定义从深到浅的调色板,对应importance 0到2 priority_palette = ['#003399', '#006633', '#FF9933'] axes = sns.relplot( data=tidy, x='index', y='number', hue='importance', palette=priority_palette, kind="line" )
这样就能轻松突出你关注的高数值车辆类别啦!
内容的提问来源于stack exchange,提问作者Jordan
相关产品推荐
相关产品推荐

