使用seaborn绘图时如何为色调参数指定多个变量?

Zyt*_*hyr 11 data-visualization matplotlib pandas seaborn pandas-groupby

使用seaborn时,有没有办法可以为hue参数包含多个变量(列)?提出这个问题的另一种方法是,在将数据绘制在单个 x,y 轴图上之前,如何按多个变量对数据进行分组?

我想做如下的事情。但是目前我无法为色调参数指定两个变量:

sns.relplot(x='#', y='Attack', hue=['Legendary', 'Stage'], data=df)
Run Code Online (Sandbox Code Playgroud)

例如,假设我有一个如下所示的 pandas DataFrame,其中包含通过本教程获得的Pokemon 数据库

在此输入图像描述

我想在 x 轴上绘制pokedex #,在 y 轴上绘制Attack。但是,我希望数据按StageLegendary进行分组。使用matplotlib ,我编写了一个自定义函数,该函数按['Legendary','Stage']对数据帧进行分组,然后迭代每个组进行绘图(请参阅下面的结果)。虽然我的自定义函数按预期工作,但我希望这可以简单地通过 seaborn 来实现。我猜一定还有其他人尝试使用seaborn在单个图中可视化超过3个变量?

fig, ax = plt.subplots()
grouping_variables = ['Stage','Legendary']
group_1 = df.groupby(grouping_variables)
for group_1_label, group_1_df in group_1:
    ax.scatter(group_1_df['#'], group_1_df['Attack'], label=group_1_label)
ax_legend = ax.legend(title=grouping_variables)    
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

编辑1:

注意:在我提供的示例中,我按两个变量(例如:Legendary 和 Stage)对数据进行分组。然而,其他情况可能需要任意数量的变量(例如:5 个变量)。

dlu*_*kes 13

hue您可以利用接受列名称或与数据长度相同的序列的事实,列出要分配每个数据点的颜色类别。所以...

sns.relplot(x='#', y='Attack', hue='Stage', data=df)
Run Code Online (Sandbox Code Playgroud)

...基本上与以下相同:

sns.relplot(x='#', y='Attack', hue=df['Stage'], data=df)
Run Code Online (Sandbox Code Playgroud)

您通常不会使用后者,只是需要更多的输入来实现相同的效果 - 除非您想动态构建自定义序列:

sns.relplot(x='#', y='Attack', data=df,
            hue=df[['Legendary', 'Stage']].apply(tuple, axis=1))
Run Code Online (Sandbox Code Playgroud)

使用两列表示色调的 Seaborn 绘图

构建传递的序列的方式hue完全取决于您,唯一的要求是它必须与您的数据具有相同的长度,并且如果是类似数组的,它必须是一维的,所以您不能只是通过hue=df[['Legendary', 'Stage']],你必须以某种方式将列连接成一列。我选择了tuple最简单、最通用的方法,但如果您想更好地控制格式,请构建Series字符串。我将把它保存到一个单独的变量中,以提高可读性,这样我就可以给它指定一个名称(将用作图例标题),但您不必这样做:

hue = df[['Legendary', 'Stage']].apply(
    lambda row: f"{row.Legendary}, {row.Stage}", axis=1)
hue.name = 'Legendary, Stage'
sns.relplot(x='#', y='Attack', hue=hue, data=df)
Run Code Online (Sandbox Code Playgroud)

Seaborn 图使用两列表示色调,更高级的版本


Diz*_*ahi 6

在seaborn中scatterplot(),您可以组合ahue=和astyle=参数来为每种组合生成不同的标记和不同的颜色

示例(逐字摘自文档):

tips = sns.load_dataset("tips")
ax = sns.scatterplot(x="total_bill", y="tip", data=tips)
ax = sns.scatterplot(x="total_bill", y="tip",
                     hue="day", style="time", data=tips)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述