如何将组合组的箱线图添加到 Seaborn 的分组箱线图中?

How to add a boxplot of combined groups into the plot of grouped boxplots in Seaborn?

我用 Seaborn 生成了分组箱线图:

sns.boxplot(x="DATE", y="Rate", data=mydata)

我有 15 个框用于 15 个不同的日期,现在我想再添加一个框以显示同一图中的总体分布(即所有组的组合)。

如果我只是这样做:

sns.boxplot(x="DATE", y="Rate", data=mydata)
sns.boxplot(y=mydata["Rate"])

我可以生成一个显示所有框的图,但我无法正确排列我的 xticklabels。有没有更好的方法来添加组合箱线图?或者,如何设置 xticklabels?

谢谢!

Seaborn 的 boxplot 似乎不允许合并来自 2 个单独调用的箱线图。 但是,您可以使用底层 matplotlib boxplot 来实现所需的组合。

plt.boxplot 的第一个参数是一个列表。列表的每个条目都包含与该条目的箱线图对应的数据集。因此,创建了一个列表,其中包含每天的一个数据集,以及一个单独的条目用于整个箱线图。 positions= 参数告诉每个箱线图的 x-position。 patch_artist=True 创建可以填充的箱线图(默认是仅包含线条的箱线图)。中位数的颜色可以更改,以便根据为框选择的颜色更好地显示。

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

# create some toy data for 15 days
dates = pd.date_range('2020-10-01', freq='D', periods=15)
df = pd.DataFrame({'DATE': pd.to_datetime(np.random.choice(dates, 500)),
                   'Rate': np.random.uniform(2, 10, 500)})

fig, ax = plt.subplots(figsize=(12, 4))
ax.boxplot([df[df['DATE'] == d]['Rate'] for d in dates] + [df['Rate']],
           positions=range(len(dates)+1), patch_artist=True,
           medianprops={'color': 'navy'})
# assign colors as if they were set with seaborn
for box, color in zip(ax.artists, sns.color_palette('husl', len(ax.artists))):
    box.set_color(color)
# set the labels for the x-ticks
ax.set_xticklabels([str(d)[:10] for d in dates] + ['overall'], rotation=45)
# optionally add a vertical line to separate the special box
ax.axvline(len(dates) - 0.5, color='black', ls=':')
plt.tight_layout()
plt.show()

PS: 展示了一种在 seaborn barplotboxplot.

中使用日期设置 xticks 的方法