R语言绘制对称相交曲线及标注交点技术求助
解决思路与实现步骤
1. 调整函数参数,做出对称曲线
你现在画的曲线不对称,问题出在两条函数的增长/衰减速率和值域完全不匹配:
- 蓝色曲线
exp(-0.1x)从x=0的1,一路衰减到x=50的几乎0; - 红色曲线
exp(0.014x)-1从x=0的0,到x=50才增长到约0.1,幅度差太多,自然不对称。
要做出示例图的对称效果,得让两条曲线的值域范围一致,且变化速率匹配。最简单的方式是调整红色曲线的参数,让它的终点值和蓝色曲线的起点值对应(比如都到1):
调整参数后的基础代码
I0 <- log(1) b <- 0.1 # 计算d值,让x=50时红色曲线刚好到1 d <- log(2)/50 curve(exp(I0 - b * x), 0, 50, col = "blue", lwd = 2, ylim = c(0,1)) curve(exp(d * x) - 1, 0, 50, add = TRUE, col = "red", lwd = 2)
如果想要更完美的镜像对称,直接用镜像函数就行:
b <- 0.1 # 蓝色曲线:从1衰减到0 curve(exp(-b*x), 0, 50, col="blue", lwd=2, ylim=c(0,1)) # 红色曲线:从0增长到1,和蓝色完全镜像 curve(1 - exp(-b*x), 0, 50, add=TRUE, col="red", lwd=2)
2. 找交点,画指示箭头
要加箭头,得先算出两条曲线的交点坐标:
- 要是用上面的镜像函数,直接解方程就能得到:
x=log(2)/b,y=0.5; - 要是用自定义函数,就用
uniroot来求解:
# 定义两条曲线的差值函数,找差值为0的x find_intersection <- function(x) { exp(I0 - b*x) - (exp(d*x) - 1) } # 求解交点的x值 intersect_x <- uniroot(find_intersection, interval=c(0,50))$root # 代入任意一条曲线得y值 intersect_y <- exp(I0 - b*intersect_x) # 用arrows画箭头,调整参数控制位置和样式 arrows(intersect_x - 10, intersect_y + 0.2, intersect_x, intersect_y, lwd=1.5, length=0.1, col="black") arrows(intersect_x + 10, intersect_y - 0.2, intersect_x, intersect_y, lwd=1.5, length=0.1, col="black")
3. 完整可运行代码
# 设置参数 b <- 0.1 d <- log(2)/50 I0 <- log(1) # 绘制曲线,指定y轴范围避免截断 curve(exp(I0 - b * x), 0, 50, col = "blue", lwd = 2, ylim = c(0,1), xlab="X轴", ylab="Y轴") curve(exp(d * x) - 1, 0, 50, add = TRUE, col = "red", lwd = 2) # 求解交点 find_intersection <- function(x) { exp(I0 - b*x) - (exp(d*x) - 1) } intersect_x <- uniroot(find_intersection, interval=c(0,50))$root intersect_y <- exp(I0 - b*intersect_x) # 绘制指向交点的箭头 arrows(intersect_x - 8, intersect_y + 0.15, intersect_x, intersect_y, lwd=1.5, length=0.1, col="black") arrows(intersect_x + 8, intersect_y - 0.15, intersect_x, intersect_y, lwd=1.5, length=0.1, col="black") # 可选:添加交点标注 text(intersect_x, intersect_y + 0.08, "交点", cex=0.8)
内容的提问来源于stack exchange,提问作者maurobio
相关产品推荐
相关产品推荐

