如何将组合组的箱线图添加到 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 barplot
或 boxplot
.
中使用日期设置 xticks 的方法
我用 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:barplot
或 boxplot
.