有没有办法在seaborn的箱线图中,在均值标记旁边显示均值的数值?
我有一组数据点,用来表示某区域的土壤铁含量。基于这组数据,我使用scikit-learn的 k-means聚类,将数据聚成10个簇。这个箱线图显示了每个簇内铁含量的分布,每个簇由一个标签来表示。
sns.boxplot(data=data,
x='labels',
y='iron_content',
hue='labels',
ax=ax[1],
palette=palette,
fliersize=0.8,
showmeans=True,
meanprops={'marker': 'o', 'markerfacecolor': 'white', 'markeredgecolor': 'black', 'markersize': '8'})
我已经把均值的位置标注在图上(showmeans, meanprops),不过,我想知道是否可以在图上显示每个箱子的均值数值。要么在 legend 的位置显示,或者直接在均值 marker 旁边显示。
以下是我希望图表呈现的样子:

解决方案
你需要这个:
for i, m in enumerate(data.groupby('labels')['iron_content'].mean().sort_index()):
ax[1].text(i, m, f'{m:.2f}', ha='left', va='bottom', fontsize=8)
下面给出一个可复现的示例:
import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
np.random.seed(1)
means = [0.30, 0.20, 0.50, 0.10, 0.02, 0.10, 0.35, 0.40, 0.35, 0.01]
data = pd.concat([
pd.DataFrame({'iron_content':
np.clip(np.random.normal(m, m*0.3 + 0.02, 1500), 0, None),
'labels': i})
for i, m in enumerate(means)
])
fig, ax = plt.subplots(1, 2, figsize=(12, 5))
fig.delaxes(ax[0]) # only showing one plot like your example
sns.boxplot(data=data, x='labels', y='iron_content', hue='labels', ax=ax[1],
fliersize=1, showmeans=True,
meanprops={'marker': 'o', 'markerfacecolor': 'white',
'markeredgecolor': 'black'})
ax[1].legend(bbox_to_anchor=(1.02, 1), loc='upper left')
for i, m in enumerate(data.groupby('labels')['iron_content'].mean().sort_index()):
ax[1].text(i, m, f'{m:.2f}', ha='left', va='bottom', fontsize=8)
plt.show()

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。