如何在R语言绘图中叠加显示曲线下的两个对称区域?
问题描述
我编写了一个用于绘制高斯分布曲线下区域的R函数areaplotter,代码如下:
areaplotter <- function(x1,x2){ x <- seq(from=-4,to=4,len=100) plot(x,dnorm(x),type='l') jj <- seq(from=x1,to=x2,len=100) polygon(x=c(jj,x2,x1),y=c(dnorm(jj),0,0),col='red') }
我希望将areaplotter(-4,qnorm(0.05))和areaplotter(qnorm(1-0.05),4)这两个调用生成的阴影区域合并到同一张图中(两区域呈对称分布)。目前我通过par(mfrow = c(1,2))实现了两图并列,但无法在同一图中叠加阴影区域。作为R语言新手,我尝试过使用lines()函数但未成功,现求助是否有简单语法或合适函数实现该需求。
解决方案
你的原函数每次调用都会执行plot(),这会清空当前绘图并重新生成画布,所以无法叠加阴影区域。可以通过以下两种简单方法实现需求:
方法1:修改原函数,添加绘图控制参数
给函数新增一个init_plot参数,默认值为TRUE(表示首次调用时绘制基础曲线),当需要叠加阴影时将该参数设为FALSE,避免重复初始化画布:
areaplotter <- function(x1, x2, init_plot = TRUE){ x <- seq(from=-4, to=4, len=100) if(init_plot){ plot(x, dnorm(x), type='l') } jj <- seq(from=x1, to=x2, len=100) polygon(x=c(jj, x2, x1), y=c(dnorm(jj), 0, 0), col='red') } # 调用示例:先画基础曲线,再叠加两个阴影区域 areaplotter(-4, qnorm(0.05)) areaplotter(qnorm(1-0.05), 4, init_plot = FALSE)
方法2:拆分绘图步骤,手动控制流程
直接分步绘制基础曲线和两个阴影区域,逻辑更直观,适合新手理解:
# 1. 绘制高斯分布基础曲线 x <- seq(-4, 4, len=100) plot(x, dnorm(x), type='l') # 2. 绘制左侧阴影区域(-4 到 qnorm(0.05)) left_range <- seq(-4, qnorm(0.05), len=100) polygon(x=c(left_range, qnorm(0.05), -4), y=c(dnorm(left_range), 0, 0), col='red') # 3. 绘制右侧阴影区域(qnorm(0.95) 到 4) right_range <- seq(qnorm(0.95), 4, len=100) polygon(x=c(right_range, 4, qnorm(0.95)), y=c(dnorm(right_range), 0, 0), col='red')
内容的提问来源于stack exchange,提问作者Ludovic Bognon
相关产品推荐
相关产品推荐

