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

时间:2020-10-20 20:34:04

标签: python pandas seaborn boxplot

我与Seaborn生成了分组的箱线图:

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

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

如果我只是这样做:

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

我可以生成一个显示所有框的图,但是我不能正确排列我的xticklabel。有没有更好的方法来添加组合箱形图?另外,如何设置xticklabels?

谢谢!

1 个答案:

答案 0 :(得分:0)

Seaborn的boxplot似乎不允许组合来自两个单独呼叫的箱形图。 但是,您可以使用基础的matplotlib boxplot来实现所需的组合。

plt.boxplot的第一个参数是一个列表。列表的每个条目都包含与该条目的箱线图相对应的数据集。因此,将创建一个列表,其中包含每天的一个数据集,以及用于整个箱形图的单独条目。 positions=参数指示每个箱线图的x位置。 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()

example plot

PS:Ordering and Formatting Dates on X-Axis in Seaborn Bar Plot显示了一种在日期barplotboxplot中设置带有日期的xticks的方法。