R语言直方图优化:添加均值标记与95百分位截断高亮
优化方案与实现代码
1. 修正原函数的问题
原函数存在参数传递错误、逻辑冗余等问题,以下是优化后的版本:
Fluorescence_Intensity <- function(X, MEAN, SD, METHOD){ res <- switch(METHOD, rnorm = rnorm(X, MEAN, SD), dnorm = dnorm(X, MEAN, SD), qnorm = qnorm(X, MEAN, SD), stop("无效的METHOD参数,请选择 'rnorm', 'dnorm' 或 'qnorm'") ) return(res) }
优化点:
- 用
switch替代多段if,逻辑更简洁且避免冗余判断 - 修正
qnorm的错误参数传递,移除不必要的默认值声明 - 添加参数合法性校验,避免无效输入
- 用
return()明确返回结果,避免不必要的打印输出
2. 满足需求的直方图绘制代码
以下代码实现了绿色标记均值、蓝色高亮95百分位截断后部分的需求:
library(scales) # 预生成两组荧光强度数据 data_group1 <- Fluorescence_Intensity(X=1000, MEAN=2, SD=1, METHOD="rnorm") data_group2 <- Fluorescence_Intensity(X=1000, MEAN=30, SD=1, METHOD="rnorm") # 计算两组数据的95百分位阈值 p95_group1 <- quantile(data_group1, 0.95) p95_group2 <- quantile(data_group2, 0.95) # 绘制基础直方图(灰色主体) hist(data_group1, xlim=c(0, 40), col=alpha('gray70', 0.4), border=F, main="荧光强度分布", xlab="荧光强度") hist(data_group2, add=T, col=alpha('gray70', 0.8), border=F) # 高亮95百分位右侧的部分(蓝色) hist(data_group1[data_group1 > p95_group1], add=T, col=alpha('blue', 0.6), border=F) hist(data_group2[data_group2 > p95_group2], add=T, col=alpha('blue', 0.6), border=F) # 用绿色实线标记两组数据的均值 abline(v=2, col="green", lwd=2) abline(v=30, col="green", lwd=2) # 可选:添加图例区分元素 legend("topright", legend=c("主体分布", "95百分位以上", "均值"), col=c(alpha('gray70', 0.6), alpha('blue', 0.6), "green"), pch=c(15, 15, NA), lty=c(NA, NA, 1), lwd=c(NA, NA, 2))
关键实现说明
- 预生成数据并存储,避免重复计算和冗余打印
- 通过筛选
>95百分位的数据子集,单独绘制直方图实现高亮效果 - 用
abline绘制绿色均值线,直观标记分布中心 - 保持背景为默认白色,符合需求要求
内容的提问来源于stack exchange,提问作者Daisy
相关产品推荐
相关产品推荐

