如何在R中同一张图绘制不同epsilon对应的res密度曲线?
多epsilon值的tau_epsilon密度曲线绘制方案
问题背景
已有R代码实现单个epsilon(0.9)下,1000个初始值对应的tau_epsilon(即满足h1t(t,x0)=epsilon的t值)的密度图,现需要在同一张图中绘制epsilon取0.1、0.2、0.3、0.9时的密度曲线。
解决方案步骤
1. 优化t值查找函数
调整find_t函数,支持外部传入epsilon参数,同时添加异常捕获避免个别初始值导致程序中断:
find_t <- function(x, epsilon, range = c(-500, 500)) { # 捕获uniroot报错,返回NA避免中断流程 result <- tryCatch({ uniroot(function(t) h1t(t, x) - epsilon, range, tol = .Machine$double.eps)$root }, error = function(e) { NA }) result }
2. 批量计算不同epsilon对应的res
定义目标epsilon集合,批量生成每个epsilon对应的t值结果:
# 设定要测试的epsilon值 epsilon_values <- c(0.1, 0.2, 0.3, 0.9) # 批量计算每个epsilon对应的所有初始值的t值 res_list <- lapply(epsilon_values, function(eps) { lapply(xmats, find_t, epsilon = eps) }) # 给结果列表命名,方便后续识别 names(res_list) <- paste0("epsilon_", epsilon_values)
3. 绘制叠加密度曲线
先绘制第一条曲线作为基础,再用lines()函数依次叠加其他曲线,同时添加图例区分不同epsilon:
# 定义对应每个epsilon的颜色 color_vec <- c("blue", "green", "orange", "red") # 绘制第一个epsilon的密度曲线作为基底 dens_first <- density(unlist(res_list[[1]]), na.rm = TRUE) plot(dens_first, xlim = c(0, 300), col = color_vec[1], main = "Density of tau_epsilon for different epsilon values (n=500)", xlab = "tau_epsilon", ylab = "Density") # 循环叠加剩余epsilon的密度曲线 for (i in 2:length(epsilon_values)) { dens <- density(unlist(res_list[[i]]), na.rm = TRUE) lines(dens, col = color_vec[i]) } # 添加图例说明各曲线对应的epsilon值 legend("topright", legend = paste0("epsilon=", epsilon_values), col = color_vec, lty = 1, cex = 0.8)
补充说明
- 加入
tryCatch是为了处理个别初始值无法在指定区间内找到满足条件的t值的情况,避免程序崩溃;绘图时通过na.rm=TRUE忽略无效的NA值。 - 可根据需求调整
xlim范围、颜色配置、图例位置等参数,优化图表展示效果。
内容的提问来源于stack exchange,提问作者oliver
相关产品推荐
相关产品推荐

