尝试使用近似函数找到交点,结果在 y 轴上正确但在 x 轴上偏离
Trying to find point of intersection using approx function, results are correct on y but off on x axis
在 R 中工作,我试图绘制河流横截面,在与已识别 "bankful" 点相对的交叉点处插入一个点,并计算河岸线下方的面积。它是处理许多横截面的循环的一部分。我想出的最好的解决方案是使用 approx 函数,但是所有的点都不完全在交点上,我无法弄清楚我做错了什么。
很难提供示例数据,因为它是循环的一部分,但下面的代码示例会产生图像中的结果。蓝色三角形应该位于 "bankful" 虚线和实线横截面周界线之间的交点。
###sample data
stn.sub.sort <- data.frame(dist = c(0,1.222,2.213,2.898,4.453,6.990,7.439,7.781,8.753,10.824,10.903,13.601,17.447), depth=c(-0.474,-0.633,0,-0.349,-1.047,-2.982,-2.571,-3.224,-3.100,-3.193,-2.995,-0.065,-0.112), Bankful = c(0,0,0,0,1,0,0,0,0,0,0,0,0))
###plot cross section with identified bankful
plot(stn.sub.sort$dist,
as.numeric(stn.sub.sort$depth),
type="b",
col=ifelse(stn.sub.sort$Bankful==1,"red","black"),
ylab="Depth (m)",
xlab="Station (m)",
ylim=range(stn.sub.sort$depth),
xlim=range(stn.sub.sort$dist),
main="3")
###visualize bankful line of intersection
abline(h=stn.sub.sort$depth[stn.sub.sort$Bankful==1],
lty=2,
col="black")
###approximate point at intersection
index.bf=which(stn.sub.sort$Bankful==1)
index.approx<-which(stn.sub.sort$dist>stn.sub.sort$dist[index.bf])
sbf <- approx(stn.sub.sort$depth[index.approx],
stn.sub.sort$dist[index.approx],
xout=stn.sub.sort$depth[index.bf])
###plot opposite bankful points
points(sbf$y,sbf$x,pch=2,col="blue")
所以你的描述留下了许多关于你必须处理的数据的性质的问题。我将假设它与您的示例大致相同 - 从第一个倾斜点下降,然后再次上升,曲线再次穿过倾斜点的深度。
有了这个假设,很容易找到交叉点之前和之后的点。您只需要在这两点之间画线并求解正确的 dist 值。我在下面通过使用 approxfun
获得连接两点的线的 反函数 来执行此操作。然后我们可以直接插入得到交叉点的距离值。
BankfulDepth = stn.sub.sort$depth[stn.sub.sort$Bankful==1]
Low = max(which(stn.sub.sort$depth < BankfulDepth))
InvAF = approxfun(stn.sub.sort$depth[c(Low,Low+1)],
stn.sub.sort$dist[c(Low,Low+1)])
points(InvAF(BankfulDepth), BankfulDepth, pch=2,col="blue")
在 R 中工作,我试图绘制河流横截面,在与已识别 "bankful" 点相对的交叉点处插入一个点,并计算河岸线下方的面积。它是处理许多横截面的循环的一部分。我想出的最好的解决方案是使用 approx 函数,但是所有的点都不完全在交点上,我无法弄清楚我做错了什么。
很难提供示例数据,因为它是循环的一部分,但下面的代码示例会产生图像中的结果。蓝色三角形应该位于 "bankful" 虚线和实线横截面周界线之间的交点。
###sample data
stn.sub.sort <- data.frame(dist = c(0,1.222,2.213,2.898,4.453,6.990,7.439,7.781,8.753,10.824,10.903,13.601,17.447), depth=c(-0.474,-0.633,0,-0.349,-1.047,-2.982,-2.571,-3.224,-3.100,-3.193,-2.995,-0.065,-0.112), Bankful = c(0,0,0,0,1,0,0,0,0,0,0,0,0))
###plot cross section with identified bankful
plot(stn.sub.sort$dist,
as.numeric(stn.sub.sort$depth),
type="b",
col=ifelse(stn.sub.sort$Bankful==1,"red","black"),
ylab="Depth (m)",
xlab="Station (m)",
ylim=range(stn.sub.sort$depth),
xlim=range(stn.sub.sort$dist),
main="3")
###visualize bankful line of intersection
abline(h=stn.sub.sort$depth[stn.sub.sort$Bankful==1],
lty=2,
col="black")
###approximate point at intersection
index.bf=which(stn.sub.sort$Bankful==1)
index.approx<-which(stn.sub.sort$dist>stn.sub.sort$dist[index.bf])
sbf <- approx(stn.sub.sort$depth[index.approx],
stn.sub.sort$dist[index.approx],
xout=stn.sub.sort$depth[index.bf])
###plot opposite bankful points
points(sbf$y,sbf$x,pch=2,col="blue")
所以你的描述留下了许多关于你必须处理的数据的性质的问题。我将假设它与您的示例大致相同 - 从第一个倾斜点下降,然后再次上升,曲线再次穿过倾斜点的深度。
有了这个假设,很容易找到交叉点之前和之后的点。您只需要在这两点之间画线并求解正确的 dist 值。我在下面通过使用 approxfun
获得连接两点的线的 反函数 来执行此操作。然后我们可以直接插入得到交叉点的距离值。
BankfulDepth = stn.sub.sort$depth[stn.sub.sort$Bankful==1]
Low = max(which(stn.sub.sort$depth < BankfulDepth))
InvAF = approxfun(stn.sub.sort$depth[c(Low,Low+1)],
stn.sub.sort$dist[c(Low,Low+1)])
points(InvAF(BankfulDepth), BankfulDepth, pch=2,col="blue")