Seaborn PairGrid 使用 swarm 图

3

我有一个类似于这样的数据集:

f1  f2  f3     value
4   2   3      0.927252
1   3   0      0.153415
0   1   1      0.928820
1   0   4      0.933250
0   4   3      0.397307
...

我想要创建一个 Seaborn 的 PairGrid,每个特征对(f1、f2 和 f3)都有一个带有 jitter 或 swarmplot 的 stripplot,并使用 value 作为 hue。对角线上的图应该类似于下面的图像,我是用以下代码创建的:
df = ...  # My dataset
sns.stripplot("f1", "f1", "value", data=df, jitter=True,
              palette=sns.light_palette("red", len(df)),
              hue_order=sorted(df["value"])).legend().remove()

而非对角线的图表会是这样的:

2D strip plot

同样,我是用以下代码生成的:

df = ...  # My dataset
sns.stripplot("f1", "f2", "value", data=df, jitter=True,
              palette=sns.light_palette("red", len(df)),
              hue_order=sorted(df["value"])).legend().remove()

因此,我所尝试的是:

import seaborn as sns
df = ...  # My dataset
g = sns.PairGrid(df, hue="value", palette=sns.light_palette("red", len(df)),
                 hue_order=sorted(df["value"]), vars=df.columns[:-1])
g.map_diag(lambda x, **kwargs: sns.stripplot(x, x, **kwargs), jitter=True)
g.map_offdiag(sns.stripplot, jitter=True)

然而,这样做产生了以下结果:

Strip plot pair grid

我不太清楚我错过了什么。我仍然可以自己制作图表并将它们放入自己的子图中,但这就是成对网格的全部意义。这些类型的图表因某些原因而不支持网格吗?

1个回答

8
与名称所示不同,hue参数并不定义颜色。更好的理解方式可能是将其视为“进一步维度”或类似的东西。虽然在许多情况下,这种进一步维度通过颜色来可视化,但并不是每个图都是如此。为了获得所需的PairGrid,我们可以省略hue,以便显示所有值。
import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randint(0,5, size=(4**3, 3)), columns=["f1", "f2", "f3"])
df["value"] = np.random.rand(len(df))

g = sns.PairGrid(df, vars=df.columns[:-1])
g.map(sns.stripplot, jitter=True, size=3)

plt.show()

enter image description here

这里的重点是,PairGridhuestripplothue 完全不同。你确实可以使用 stripplot 自身的 hue 来为每个单独的图中的点着色,而 PairGridhue 则将数据框分成进一步的类别,每个 hue 值一个类别;这在这里是不需要的,因为数据框中的值列包含连续变量,你最终会得到与该列中不同值一样多的类别。

好的,有趣的是它可以在没有“色调”参数的情况下工作。但是请注意,如果我这样做g.map(sns.stripplot, jitter=True, size=3, hue=df["value"], palette=sns.light_palette("red", len(df)), hue_order=sorted(df["value"])),我实际上得到了我想要的结果。对我来说,这是一种不一致的行为...但也许您可以解释一下当您说色调只是一个“进一步的维度”,而不一定是颜色时,您的意思是什么? - jdehesa
我在回答中尝试更好地解释了一下。您确定得到的图是正确的,即点的颜色对应其值,还是只是来自调色板的任意颜色? - ImportanceOfBeingErnest
其实很难百分之百确定,但是我觉得是的。这里是一个简单情况的截图(两个特征和10个数据点),将f1f2的图并排进行比较,一个来自于Pair Grid,另一个来自于单个Strip Plot。点击此处查看截图。 - jdehesa
我接受这个答案,因为它确实帮助我解决了问题,但是我仍然会在Seaborn中开放问题,因为我发现这种行为“令人惊讶”,至少是这样。我会发布一个评论来说明结果。 - jdehesa
我觉得更令人惊讶的是,使用 hue=df.values 居然没有产生与预期相似的图形。因为每个类别只有一个值,所以我本来期望看到每个图形只有一个点。 - ImportanceOfBeingErnest

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接