如何为标准正态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
相关产品推荐
相关产品推荐

