我与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?
谢谢!
答案 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()
PS:Ordering and Formatting Dates on X-Axis in Seaborn Bar Plot显示了一种在日期barplot
或boxplot
中设置带有日期的xticks的方法。