Seaborn lineplot如何拆分hue所用列名生成双维度组合图例
实现方案
Seaborn 绘图默认更适配长表(Tidy Data)结构,你只需要先把原始宽表重塑为长格式,拆分列名得到两个分组维度,再传入绘图参数即可,图例会自动生成对应拆分字段的组合标识。
步骤1:重塑数据拆分列名
先通过melt把宽表转成长表,再按下划线拆分原始列名,生成两个独立的分组字段,同时补充x轴对应的序列索引:
import pandas as pd import numpy as np import seaborn as sns import matplotlib.pyplot as plt # 原始示例数据 df = pd.DataFrame(np.array([[1, 2, 3, 4], [4, 5, 6, 4], [7, 8, 9, 4]]), columns=['NP_A', 'NP_B', 'NP_C', "OP_A"]) # 宽表转长表 df_long = df.melt(var_name='origin_col', value_name='val') # 按下划线拆分列名,得到两个分组维度 df_long[['main_type', 'sub_type']] = df_long['origin_col'].str.split('_', expand=True) # 生成x轴位置索引,对应原始数据的行号 df_long['x_axis'] = df_long.groupby('origin_col').cumcount()
步骤2:调用lineplot绘图
你可以选择两种图例展示方式:
方式1:双维度区分(颜色+线型)
把拆分后的两个字段分别传给hue(颜色分组)和style(线型分组),同属一类主分组的折线颜色一致,同属一类子分组的折线线型一致,组合区分所有系列:
sns.lineplot( data=df_long, x='x_axis', y='val', hue='main_type', style='sub_type', markers=True, dashes=True ) plt.legend(title='分组组合') plt.show()
方式2:单维度合并分组
如果希望图例直接展示拆分后两个字段的组合值,可以把两个字段拼接成新的分组列,直接传给hue参数:
df_long['combine_type'] = df_long['main_type'] + '-' + df_long['sub_type'] sns.lineplot( data=df_long, x='x_axis', y='val', hue='combine_type', marker='o' ) plt.show()
内容的提问来源于stack exchange,提问作者Simone Panico
相关产品推荐
相关产品推荐

