是否可以用每组中的观察次数来注释 seaborn 小提琴图?
Is it possible to annotate a seaborn violin plot with number of observations in each group?
我想用每组中的观察次数来注释我的小提琴图。所以这个问题本质上和this one是一样的,除了:
- python 而不是 R,
- seaborn 而不是 ggplot,并且
- 小提琴图而不是箱线图
让我们以 Seaborn API documentation 中的这个例子为例:
import seaborn as sns
sns.set_style("whitegrid")
tips = sns.load_dataset("tips")
ax = sns.violinplot(x="day", y="total_bill", data=tips)
我想在小提琴上放置 n=62、n=19、n=87 和 n=76。这可行吗?
您首先需要存储 y 位置和 x 位置的所有值(为此使用您的数据集)以便使用 ax.text
,然后一个简单的 for
循环可以将所有内容写入位置期望:
import seaborn as sns
import matplotlib.pyplot as plt
tips = sns.load_dataset("tips")
ax = sns.violinplot(x="day", y="total_bill", data=tips)
yposlist = tips.groupby(['day'])['total_bill'].median().tolist()
xposlist = range(len(yposlist))
stringlist = ['n = 62','n = 19','n = 87','n = 76']
for i in range(len(stringlist)):
ax.text(xposlist[i], yposlist[i], stringlist[i])
plt.show()
在这种情况下,我喜欢预先计算注释值并将它们合并到分类轴中。换句话说,预先计算例如 "Thurs, N = xxx"
看起来像这样:
import seaborn as sns
sns.set_style("whitegrid")
ax= (
sns.load_dataset("tips")
.assign(count=lambda df: df['day'].map(df.groupby(by=['day'])['total_bill'].count()))
.assign(grouper=lambda df: df['day'].astype(str) + '\nN = ' + df['count'].astype(str))
.sort_values(by='day')
.pipe((sns.violinplot, 'data'), x="grouper", y="total_bill")
.set(xlabel='Day of the Week', ylabel='Total Bill (USD)')
)
我想用每组中的观察次数来注释我的小提琴图。所以这个问题本质上和this one是一样的,除了:
- python 而不是 R,
- seaborn 而不是 ggplot,并且
- 小提琴图而不是箱线图
让我们以 Seaborn API documentation 中的这个例子为例:
import seaborn as sns
sns.set_style("whitegrid")
tips = sns.load_dataset("tips")
ax = sns.violinplot(x="day", y="total_bill", data=tips)
我想在小提琴上放置 n=62、n=19、n=87 和 n=76。这可行吗?
您首先需要存储 y 位置和 x 位置的所有值(为此使用您的数据集)以便使用 ax.text
,然后一个简单的 for
循环可以将所有内容写入位置期望:
import seaborn as sns
import matplotlib.pyplot as plt
tips = sns.load_dataset("tips")
ax = sns.violinplot(x="day", y="total_bill", data=tips)
yposlist = tips.groupby(['day'])['total_bill'].median().tolist()
xposlist = range(len(yposlist))
stringlist = ['n = 62','n = 19','n = 87','n = 76']
for i in range(len(stringlist)):
ax.text(xposlist[i], yposlist[i], stringlist[i])
plt.show()
在这种情况下,我喜欢预先计算注释值并将它们合并到分类轴中。换句话说,预先计算例如 "Thurs, N = xxx"
看起来像这样:
import seaborn as sns
sns.set_style("whitegrid")
ax= (
sns.load_dataset("tips")
.assign(count=lambda df: df['day'].map(df.groupby(by=['day'])['total_bill'].count()))
.assign(grouper=lambda df: df['day'].astype(str) + '\nN = ' + df['count'].astype(str))
.sort_values(by='day')
.pipe((sns.violinplot, 'data'), x="grouper", y="total_bill")
.set(xlabel='Day of the Week', ylabel='Total Bill (USD)')
)