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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 11:15:36