有没有办法在seaborn的箱线图中,在均值标记旁边显示均值的数值?

编程语言 2026-07-07

我有一组数据点,用来表示某区域的土壤铁含量。基于这组数据,我使用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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章