能否在seaborn小提琴图上注明每个组中的观测数量?

8
我想在我的小提琴图上注明每组观察值的数量。因此,这个问题本质上与这个问题相同,只是:
  • 使用python而不是R,
  • 使用seaborn而不是ggplot,
  • 使用小提琴图而不是箱线图。
让我们以Seaborn API文档中的这个例子为例:
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。这可行吗?

2个回答

9

在这种情况下,我喜欢预计算注释值并将它们合并到分类轴中。换句话说,预先计算例如“星期四,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)')   
)

enter image description here


@Phlya 你试过了吗? - Paul H
@PaulH 试试什么?如果有两个分类列用于拆分数据,我不明白这种方法如何能够奏效... - Phlya
你需要将“hue”列单独保留并将其单独传递。 - Paul H
(并使用说明--基本知识)注释色调 - Paul H
但是如果在同一组中不同色调的观测次数不同呢? - Phlya
显示剩余3条评论

3

你需要首先将所有的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()


1
那么,这个想法是预先计算x、y坐标和观测数量。然后只需使用ax.text进行注释?如果有人更喜欢在图形上方注释怎么办?不能保证小提琴图内部有足够的空间容纳文本,特别是当数字很大时。 - posdef
1
除了给图表贴标签和创建图例之外,我认为.text.annotate是唯一的方法来实现这个功能。当然,这里我使用的是一个样本数据集,但是如果手头有其他数据集,我不认为获取“x、y坐标和观测数量”会很难。如果您希望在图表上方编写文本,则需要获取小提琴图的最大值,并在yposlist中使用它。像这样:yposlist = tips.groupby(['day'])['total_bill'].max().tolist(),然后微调y位置以最好地适应图形,因为这将返回数据集的最大值。 - Vinícius Figueiredo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接