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。但是,我希望数据按Stage和Legendary进行分组。使用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)
构建传递的序列的方式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中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)