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
相关产品推荐
相关产品推荐

