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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 15:12:39