如何在箱线图(boxplot)中显示分位数(quantiles)的数值
箱线图四分位数标注实现方案
R(ggplot2环境)实现
直接用stat_summary函数计算并标注四分位数即可,示例代码如下:
# 加载依赖包 library(ggplot2) # 构造示例数据:2个分类变量、1个连续变量 set.seed(123) plot_data <- data.frame( group = rep(c("分类1", "分类2"), each = 200), value = c(rnorm(200, mean = 50, sd = 10), rnorm(200, mean = 65, sd = 12)) ) # 绘制带四分位数标注的箱线图 ggplot(plot_data, aes(x = group, y = value)) + geom_boxplot(width = 0.4) + # 标注Q1、中位数、Q3数值 stat_summary( fun = quantile, geom = "text", aes(label = after_stat(ifelse(y %in% quantile(y, c(0.25,0.5,0.75)), round(y,1), ""))), position = position_nudge(x = 0.22), # 调整横向偏移量避免和箱体重叠 size = 3.5 )
如果需要调整标注的样式、位置,修改position_nudge参数以及size、color参数即可。
Python(seaborn+matplotlib)实现
先计算各分组四分位数,再叠加文本标注即可,示例代码如下:
import seaborn as sns import matplotlib.pyplot as plt import pandas as pd import numpy as np # 构造示例数据 np.random.seed(123) plot_data = pd.DataFrame({ "group": np.repeat(["分类1", "分类2"], 200), "value": np.concatenate([np.random.normal(50,10,200), np.random.normal(65,12,200)]) }) # 计算每个分组的Q1、中位数、Q3 quants = plot_data.groupby("group")["value"].quantile([0.25,0.5,0.75]).reset_index() # 绘图 plt.figure(figsize=(6,5)) ax = sns.boxplot(x="group", y="value", data=plot_data, width=0.4) # 叠加标注 x_loc = {"分类1":0, "分类2":1} # 各分类对应的x轴坐标 for group in x_loc.keys(): q_values = quants[quants["group"]==group]["value"].values for val in q_values: ax.text(x_loc[group]+0.2, val, round(val,1), ha="center", va="center", fontsize=10) plt.show()
代码里的
x_loc[group]+0.2是控制标注的横向偏移量,数值越大标注离箱体越远,可根据实际显示效果调整。
内容的提问来源于stack exchange,提问作者Ali Grande
相关产品推荐
相关产品推荐

