如何在R语言箱线图中标注Q1、中位数、Q3及异常值?
给R基础箱线图添加Q1、中位数、Q3和异常值标注
嘿,作为R新手能自己画出箱线图已经超棒啦!要给图补上这些关键数值其实很简单,咱们用基础绘图工具就能搞定,也可以用更灵活的ggplot2来实现,两种方法都给你整理好了:
方法一:用R基础绘图包实现
首先咱们得先提取箱线图的核心统计数据,R自带的boxplot.stats()函数能直接帮我们拿到Q1、中位数、Q3还有异常值,然后用text()函数把这些数值标注到图上就行:
# 定义你的数据集 mydata <- c(154,109,137,115,152,140,154,178,101,103,126,126,137,165,165,129,200,148) # 获取箱线图的统计信息 bp_stats <- boxplot.stats(mydata) # 提取需要的数值 q1_val <- bp_stats$stats[2] # Q1是统计列表里的第2个值 median_val <- bp_stats$stats[3] # 中位数是第3个 q3_val <- bp_stats$stats[4] # Q3是第4个 outliers <- bp_stats$out # 异常值存在out元素里 # 绘制箱线图 boxplot(mydata, main = "SSHA Data", horizontal = TRUE, staplewex = 1, xlab = "Scores") # 标注Q1、中位数、Q3,把文字放在箱子上方(y=1.2),用颜色区分更清晰 text(x = q1_val, y = 1.2, labels = paste("Q1 =", q1_val), col = "blue") text(x = median_val, y = 1.2, labels = paste("Median =", median_val), col = "red") text(x = q3_val, y = 1.2, labels = paste("Q3 =", q3_val), col = "green") # 标注异常值,放在箱子下方(y=0.8),循环处理多个异常值 for (val in outliers) { text(x = val, y = 0.8, labels = paste("Outlier =", val), col = "darkorange") }
小提示:
如果文字有重叠,你可以调整y参数的数值(比如改成1.1或1.3),或者给text()加个pos参数(比如pos=3表示在上方,pos=1在下方)来微调位置。
方法二:用ggplot2实现(更美观灵活)
如果你想让图看起来更精致,试试ggplot2包,它的统计标注功能更直观:
library(ggplot2) # 把向量转成数据框(ggplot需要数据框格式) df <- data.frame(Scores = mydata) # 先获取异常值(和之前一样) bp_stats <- boxplot.stats(mydata) outliers <- bp_stats$out ggplot(df, aes(y = 1, x = Scores)) + # 绘制水平箱线图 geom_boxplot(horizontal = TRUE) + # 标注Q1(保留1位小数更整洁) geom_text(stat = "summary", fun = quantile, fun.args = list(probs = 0.25), aes(label = paste("Q1 =", round(..x.., 1))), y = 1.2, color = "blue") + # 标注中位数 geom_text(stat = "summary", fun = median, aes(label = paste("Median =", ..x..)), y = 1.2, color = "red") + # 标注Q3(保留1位小数) geom_text(stat = "summary", fun = quantile, fun.args = list(probs = 0.75), aes(label = paste("Q3 =", round(..x.., 1))), y = 1.2, color = "green") + # 标注异常值 geom_text(data = df %>% filter(Scores %in% outliers), aes(label = paste("Outlier =", Scores)), y = 0.8, color = "darkorange") + # 添加标题和坐标轴标签 labs(title = "SSHA Data", x = "Scores") + # 用简洁的主题 theme_minimal() + # 隐藏无意义的y轴元素 theme(axis.title.y = element_blank(), axis.text.y = element_blank(), axis.ticks.y = element_blank())
这样运行之后,你的箱线图上就会清晰显示所有需要的数值啦!
内容的提问来源于stack exchange,提问作者CuriousJ
相关产品推荐
相关产品推荐

