【问题标题】:Seaborn PairGrid with swarm plotsSeaborn PairGrid 与群体图
【发布时间】:2017-07-21 11:11:25
【问题描述】:

我有一个这样的数据集(有点):

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
...

我想为每对功能 f1f2f3 生成带有 stripplots 的 Seaborn stripplots 或 swarmplots,并为 @987654338 使用 value @。

对角线中的图应如下所示:

我创建的:

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()

非对角线图是这样的:

同样,我用:

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)

但是,这正在产生:

我真的不知道我在这里缺少什么。我仍然可以自己制作这些情节并将它们放入我自己的子情节中,但这就是配对网格的重点。出于某种原因,网格上是否不支持这些类型的图?

【问题讨论】:

    标签: python data-visualization seaborn swarmplot


    【解决方案1】:

    与名称可能暗示的不同,hue 参数没有定义颜色。将其视为“进一步维度”或类似的东西可能会更好。虽然在许多情况下,这个进一步的维度是通过颜色可视化的,但不一定对每个图都是如此。

    为了获得所需的 PairGrid,我们可能会忽略色调,以便显示所有值。

    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()
    

    这里的重点是PairGridhuestripplothue 完全不同。您确实可以使用 stripplot 本身的色调来为每个单独的图中的点着色,而 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"]))我实际上得到了我想要的。对我来说,这是一种不一致的行为......但也许你可以解释一下你说色调只是“进一步的维度”而不一定是颜色的意思?
    • 我试图在答案中解释得更好一些。你确定你得到的图实际上是正确的,因为点的颜色对应于它的值,或者它只是调色板中的任何颜色?
    • 嗯,实际上很难说 100% 肯定,但我认为是的,here 是比较 f1 与 @ 的更简单案例(两个特征和 10 个数据点)的屏幕截图987654335@ 并排绘制,一个来自配对网格,另一个来自单个带状图。
    • 我接受答案是因为它确实帮助我解决了我的问题,但我仍然在 Seaborn 中打开问题,因为我发现这种行为至少“令人惊讶”。我会发表评论与结果。
    • 我发现更令人惊讶的是,使用 hue=df.values 确实产生了与预期相似的情节。我本来希望看到一个图,每个图有 1 个单点,因为每个类别只有一个值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-29
    • 1970-01-01
    • 2015-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多