在matplotlib

时间:2018-04-02 13:15:33

标签: python matplotlib seaborn boxplot

我需要在matplotlib中将swarmplot添加到boxplot,但我不知道如何使用factorplot执行此操作。我想我可以用子图进行迭代,但我想学习如何用seaboard和factorplot来做。

一个简单的example(使用相同的轴ax进行绘图):

import seaborn as sns
tips = sns.load_dataset("tips")
ax = sns.boxplot(x="tip", y="day", data=tips, whis=np.inf)
ax = sns.swarmplot(x="tip", y="day", data=tips, color=".2")

结果:enter image description here

就我而言,我需要覆盖swarm factorplot:

g = sns.factorplot(x="sex", y="total_bill",
                      hue="smoker", col="time",
                      data=tips, kind="swarm",
                      size=4, aspect=.7);

boxplot

我无法弄清楚如何使用轴(从g中提取)?

类似的东西:

g = sns.factorplot(x="sex", y="total_bill",
                          hue="smoker", col="time",
                          data=tips, kind="box",
                          size=4, aspect=.7);

enter image description here

我想要这样的内容,但使用factorplotboxplot代替violinplot

enter image description here

1 个答案:

答案 0 :(得分:1)

不是试图用一个箱形图覆盖一个factorplot的两个子图(这是可能的,但我不喜欢它),可以单独创建两个子图。

然后,您将在组和轴上循环绘制一对盒子和swarmplot到每个。

import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

tips = sns.load_dataset("tips")

fig, axes = plt.subplots(ncols=2, sharex=True, sharey=True)

for ax, (n,grp) in zip(axes, tips.groupby("time")):
    sns.boxplot(x="sex", y="total_bill", data=grp, whis=np.inf, ax=ax)
    sns.swarmplot(x="sex", y="total_bill", hue="smoker", data=grp, 
                  palette=["crimson","indigo"], ax=ax)
    ax.set_title(n)
axes[-1].get_legend().remove()
plt.show()

enter image description here