首页 > 解决方案 > 如何使用 seaborn 制作带有单个数据点的箱线图

问题描述

我有一个使用以下命令创建的箱线图:

sns.boxplot(y='points_per_block', x='block', data=data, hue='habit_trial')

所以不同的颜色代表试验是否是习惯试验(0,1)。我还想绘制我尝试使用以下方法实现的各个数据点:

sns.stripplot(y='points_per_block', x='block', data=data, hue='habit_trial')

结果如下

在此处输入图像描述

我希望各个点显示在相应的箱形图上。有没有办法在不以某种方式侵入他们的位置的情况下做到这一点?问题来自这样一个事实,即使用色调分离数据对于条形图和箱形图的工作方式不同,但我原以为这些很容易组合。

提前致谢。

标签: pythonplotseaborndata-visualization

解决方案


处理分类数据的 Seaborn 函数通常有一个dodge=参数,指示是否应该将不同色调的数据分开一点。对于 a boxplotdodge默认为True,因为如果不闪避,它通常看起来很糟糕。对于stripplot默认为dodge=False.

以下示例还显示了如何更新图例(需要 matplotlib 3.4 HandlerTuple):

import seaborn as sns
from matplotlib.legend_handler import HandlerTuple

tips = sns.load_dataset("tips")
ax = sns.boxplot(data=tips, x="day", y="total_bill",
                 hue="smoker", hue_order=['Yes', 'No'], boxprops={'alpha': 0.4})
sns.stripplot(data=tips, x="day", y="total_bill",
              hue="smoker", hue_order=['Yes', 'No'], dodge=True, ax=ax)
handles, labels = ax.get_legend_handles_labels()
ax.legend(handles=[(handles[0], handles[2]), (handles[1], handles[3])],
          labels=['Smoker', 'Non-smoker'],
          loc='upper left', handlelength=4,
          handler_map={tuple: HandlerTuple(ndivide=None)})

箱线图和条形图相结合


推荐阅读