You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MATLAB:为不同类别数据的箱线图添加均值标记

解决箱线图均值位置错位的问题

嘿,这个问题我碰到过好多次啦!核心原因很简单——你没给后续类别的均值点指定正确的x轴位置。

为什么会出现错位?

当你调用plt.boxplot()的时候,matplotlib会自动给每个类别分配x轴上的位置:第一个箱线图对应x=1,第二个对应x=2,以此类推直到第6个类别对应x=6。如果你给data1的均值指定了x=1,但给data2的均值没改x值,它默认还是会用x=1,自然就叠在第一个箱线图上了。

两种靠谱的解决方法

方法一:批量处理所有类别(推荐)

把所有数据放到一个列表里,然后循环遍历每个类别,自动匹配对应的x位置,代码简洁还不容易出错:

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd

# 先从Excel读取数据,假设你的类别列是col1到col6
df = pd.read_excel('你的数据文件.xlsx')
data_categories = [df['col1'], df['col2'], df['col3'], df['col4'], df['col5'], df['col6']]

# 绘制箱线图
plt.boxplot(data_categories)

# 循环绘制每个类别的均值
for x_pos, data in enumerate(data_categories, start=1):
    mean_value = np.mean(data)
    # 用红色圆点标记均值,只在第一个点加图例避免重复
    plt.scatter(x_pos, mean_value, color='crimson', marker='o', label='均值' if x_pos == 1 else "")

# 设置x轴标签,替换成你实际的类别名称
plt.xticks([1,2,3,4,5,6], ['类别A','类别B','类别C','类别D','类别E','类别F'])
plt.legend()
plt.show()

方法二:手动指定每个箱线图的位置

如果你习惯单独绘制每个箱线图,那每次绘制时都要给boxplot和均值点指定对应的x位置:

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd

df = pd.read_excel('你的数据文件.xlsx')

# 第一个类别:x位置=1
plt.boxplot(df['col1'], positions=[1])
plt.scatter(1, np.mean(df['col1']), color='crimson', marker='o')

# 第二个类别:x位置=2
plt.boxplot(df['col2'], positions=[2])
plt.scatter(2, np.mean(df['col2']), color='crimson', marker='o')

# 以此类推,直到第6个类别指定positions=[6]
plt.boxplot(df['col6'], positions=[6])
plt.scatter(6, np.mean(df['col6']), color='crimson', marker='o')

plt.xticks([1,2,3,4,5,6], ['类别A','类别B','类别C','类别D','类别E','类别F'])
plt.show()

小提示

  • 推荐用第一种方法,尤其是类别数量多的时候,维护起来更省心
  • 除了scatter,你也可以用plt.plot(x_pos, mean_value, 'ro')来绘制均值点,效果是一样的

内容的提问来源于stack exchange,提问作者Adrianne Engel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 07:49:51