半对数图中两条线交点问题:x=0.002处y值偏差的疑问
问题原因与解决方法
核心原因
你遇到的偏差本质是坐标空间的混淆:
- 普通线性图中,两点连线是基于原始x值的线性关系,你计算的19.74是这个空间下的线性插值结果,和图中交点一致。
- 当设置
log="x"后,R会先把x值转换为对数(默认log10),然后在对数x空间里做线性连线。这个连线对应原始x的关系是指数曲线,而非原始x的线性关系,所以它和x=0.002竖线的交点y值自然会和原始线性插值的19.74不同。
举个计算验证:
- 把x转成log10值:
log10(0.0014)=-2.8539,log10(0.0027)=-2.5686,log10(0.002)=-2.6990 - 在对数x空间做线性插值:
斜率 = (22.49-17.38)/(-2.5686 - (-2.8539)) ≈ 17.915
插值y = 17.38 + 17.915*(-2.6990 + 2.8539) ≈ 20.15
这个值就是你在对数图里看到的交点y,确实大于19.74。
解决方法
根据你的需求选择对应操作:
1. 在对数x轴图上展示原始x的线性关系(即让连线和x=0.002的交点为19.74)
需要手动生成原始x线性插值的曲线,再绘制:
df.x <- c(0.0014, 0.0027) df.y <- c(17.38, 22.49) # 生成原始x线性插值的函数 linear_interp <- approxfun(df.x, df.y, method = "linear") # 绘制对数x轴图 plot(df.x, df.y, log="x", type="b", xlim=c(0.001,0.005), ylim=c(10,30)) abline(v=0.002) abline(h=19.74) # 绘制原始x线性插值的曲线(对数图中显示为曲线) x_seq <- seq(min(df.x), max(df.x), length.out=100) y_seq <- linear_interp(x_seq) lines(x_seq, y_seq, col="red", lty=2)
此时红色虚线就是原始x的线性关系,它和x=0.002的交点就是19.74。
2. 计算对数x空间下的插值y值
如果需要对数图中连线对应的插值结果,直接在对数x空间做插值:
log_x <- log10(df.x) target_log_x <- log10(0.002) log_interp_y <- approx(log_x, df.y, xout=target_log_x)$y # 输出结果约为20.15,和图中交点一致
内容的提问来源于stack exchange,提问作者akr
相关产品推荐
相关产品推荐

