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

如何为标准正态PDF曲线与圆形间的A-F区域添加阴影?

R语言实现正态曲线与圆形叠加图的区域阴影

你已经完成了标准正态PDF曲线(缩放后)与圆形的叠加绘制,现在需要为图中A、B、C、D、E、F六个区域添加阴影,核心是先找到曲线与圆形的交点,以下是具体实现方案:

原代码回顾

library(plotrix)

x   <-  seq(-3.0, 3.0, 0.01)
fy  <-  dnorm(x)
fy  <-  fy / max(fy)

plot(x, fy, ylim = c(-1, 1), col = "white", lwd = 1.5, xlim = c(-3, 3), lty = 1)

draw.circle(0.0, 0.0, 2.00,  border = 'blue', lty = 1, lwd = 0.8)

lines(x, fy, type = 'l', ylim = c(-1,1), col = 'red')
lines(x,-fy, type = 'l', ylim = c(-1,1), col = 'red')

text( 0.0, 0.90, "A"); text( 0.0,-0.90, "B")
text(-1.8, 0.25, "C"); text( 1.8, 0.25, "D")
text(-1.8,-0.25, "E"); text( 1.8,-0.25, "F")

步骤1:计算曲线与圆形的交点

圆形方程为 x² + y² = 4(圆心(0,0),半径2),缩放后的正态曲线方程为 y = ±fy(fy = dnorm(x)/max(dnorm(x)))。联立两个方程,用uniroot函数求解交点的x坐标:

# 定义联立方程:x² + (fy(x))² - 4 = 0
f <- function(x) {
  fy_val <- dnorm(x)/max(dnorm(x))
  x^2 + fy_val^2 - 4
}

# 找右侧交点(x>0),区间选(1,3):x=1时方程值为负,x=3时为正
x_right <- uniroot(f, interval = c(1, 3))$root
# 利用对称性得到左侧交点
x_left <- -x_right

步骤2:绘制各区域阴影

使用polygon函数,根据交点和曲线、圆形的边界构建闭合的多边形顶点,填充带透明度的阴影:

完整修改代码

library(plotrix)

x   <-  seq(-3.0, 3.0, 0.01)
fy  <-  dnorm(x)
fy  <-  fy / max(fy)

# 计算曲线与圆形的交点
f <- function(x) {
  fy_val <- dnorm(x)/max(dnorm(x))
  x^2 + fy_val^2 - 4
}
x_right <- uniroot(f, interval = c(1, 3))$root
x_left <- -x_right

# 初始化绘图
plot(x, fy, ylim = c(-1, 1), col = "white", lwd = 1.5, xlim = c(-3, 3), lty = 1)

# 绘制圆形
draw.circle(0.0, 0.0, 2.00,  border = 'blue', lty = 1, lwd = 0.8)

# --- 绘制各区域阴影 ---
# 区域A:上方曲线与圆形上半部分之间的区域
x_a <- c(x[x >= x_left & x <= x_right], rev(x[x >= x_left & x <= x_right]))
y_a <- c(fy[x >= x_left & x <= x_right], rev(sqrt(4 - x[x >= x_left & x <= x_right]^2)))
polygon(x_a, y_a, col = rgb(1,0,0,0.2), border = NA)

# 区域B:下方曲线与圆形下半部分之间的区域
x_b <- c(x[x >= x_left & x <= x_right], rev(x[x >= x_left & x <= x_right]))
y_b <- c(-fy[x >= x_left & x <= x_right], rev(-sqrt(4 - x[x >= x_left & x <= x_right]^2)))
polygon(x_b, y_b, col = rgb(0,0,1,0.2), border = NA)

# 区域C:左侧圆形上半部分与左半曲线之间的区域
x_c <- c(x[x <= x_left], rev(x[x <= x_left]))
y_c <- c(sqrt(4 - x[x <= x_left]^2), rev(fy[x <= x_left]))
polygon(x_c, y_c, col = rgb(0,1,0,0.2), border = NA)

# 区域D:右侧圆形上半部分与右半曲线之间的区域
x_d <- c(x[x >= x_right], rev(x[x >= x_right]))
y_d <- c(sqrt(4 - x[x >= x_right]^2), rev(fy[x >= x_right]))
polygon(x_d, y_d, col = rgb(1,1,0,0.2), border = NA)

# 区域E:左侧圆形下半部分与左下半曲线之间的区域
x_e <- c(x[x <= x_left], rev(x[x <= x_left]))
y_e <- c(-sqrt(4 - x[x <= x_left]^2), rev(-fy[x <= x_left]))
polygon(x_e, y_e, col = rgb(1,0,1,0.2), border = NA)

# 区域F:右侧圆形下半部分与右下半曲线之间的区域
x_f <- c(x[x >= x_right], rev(x[x >= x_right]))
y_f <- c(-sqrt(4 - x[x >= x_right]^2), rev(-fy[x >= x_right]))
polygon(x_f, y_f, col = rgb(0,1,1,0.2), border = NA)

# 绘制曲线
lines(x, fy, type = 'l', ylim = c(-1,1), col = 'red')
lines(x,-fy, type = 'l', ylim = c(-1,1), col = 'red')

# 添加标注
text( 0.0, 0.90, "A"); text( 0.0,-0.90, "B")
text(-1.8, 0.25, "C"); text( 1.8, 0.25, "D")
text(-1.8,-0.25, "E"); text( 1.8,-0.25, "F")

关键说明

  • 用rgb(r,g,b,alpha)设置填充色,最后一个参数alpha控制透明度(0完全透明,1不透明),避免覆盖曲线和圆形边框
  • 每个区域的多边形顶点需按顺时针/逆时针顺序闭合,因此用rev()反转x序列来连接边界
  • 利用正态曲线和圆形的对称性,只需要计算一个交点,另一个交点直接取相反数即可

内容的提问来源于stack exchange,提问作者user10630203

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 00:45:55