Seaborn,每列一个数据的小提琴图

10
我想将这个小提琴图http://seaborn.pydata.org/generated/seaborn.violinplot.html(第四个例子,split=True)与这个图http://seaborn.pydata.org/examples/elaborate_violinplot.html结合起来。

实际上,我有一个数据框架,其中包含一列成功(是或否)和几个数据列。例如:

df = pd.DataFrame(
    {"Success": 50 * ["Yes"] + 50 * ["No"], 
     "A": np.random.randint(1, 7, 100), 
     "B": np.random.randint(1, 7, 100)}
)

    A  B Success
0   6  4     Yes
1   6  2     Yes
2   1  1     Yes
3   1  2     Yes
.. .. ..     ...
95  4  4      No
96  2  1      No
97  2  6      No
98  2  3      No
99  2  1      No

我想为每个数据列绘制小提琴图。这可以通过以下方式实现:

import seaborn as sns
sns.violinplot(data=df[["A", "B"]], inner="quartile", bw=.15)

但是现在,我想按照Success列来拆分小提琴图。但是,使用hue="Success"会出现错误Cannot use 'hue' without 'x' or 'y'。那么,我该如何才能根据“Success”列来绘制小提琴图呢?

2个回答

32

如果我正确理解了你的问题,你需要将你的数据框重塑为长格式:

df = pd.melt(df, value_vars=['A', 'B'], id_vars='Success')
sns.violinplot(x='variable', y='value', hue='Success', data=df)
plt.show()

在此输入图片描述


那就是我一直在寻找的。谢谢。 - Ger
似乎不再起作用了——我的意思是运行这段代码不会生成这张图片,而是4个小提琴图。 - Charly Empereur-mot
1
要使@CharlyEmpereur-mot看起来像这个页面上的样子,您需要将参数split设置为True。从文档中可以看到:“当使用带有两个级别的变量进行嵌套时,将split设置为True将为每个级别绘制一半的小提琴。这可以使直接比较分布更容易。” - Yurii

1

我能够像这样将一个小提琴图的示例应用于 DataFrame:

df = pd.DataFrame({"Success": 50 * ["Yes"] + 50 * ["No"], 
                   "A": np.random.randint(1, 7, 100), 
                   "B": np.random.randint(1, 7, 100)})
sns.violinplot(df.A, df.B, df.Success, inner="quartile", split=True)
sns.plt.show()

Seaborn violin graph over Pandas DataFrame

显然,它仍需要一些改进:例如,A刻度应该适合单个半小提琴的尺寸。

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