R - 定位两条曲线的交点
R - locate intersection of two curves
这个论坛中有很多关于定位拟合模型和一些原始数据之间的交叉点的问题。但是,就我而言,我处于一个早期项目中,我仍在评估数据。
首先,我创建了一个数据框,其中包含理想值为 1.0 的比率值。我绘制了数据框,还使用 abline()
函数在 y=1.0
处绘制了一条水平线。这条水平线和比率图在某个点相交。
plot(a$TIME.STAMP, a$PROCESS.RATIO,
xlab='Time (5s)',
ylab='Process ratio',
col='darkolivegreen',
type='l')
abline(h=1.0,col='red')
我的目标是找到交点,比如x
并在x±k
画两条垂直线,如abline(v=x-k)
和abline(v=x+k)
其中,k是某个带容忍度。
在绘图上应用网格并不是一个真正的选择,因为该绘图将成为多面板绘图的一部分。而且,由于比率数据布局非常紧凑,情节不会太可读。最后,x±k
在我与领域专家的讨论中将非常有价值。
你能指导我如何实现吗?
这里有两种解决方法。第一个使用 locator()
,如果您没有太多要制作的图表,它将很有用:
x <- 1:5
y <- log(1:5)
df1 <-data.frame(x= 1:5,y=log(1:5))
k <-0.5
plot(df1,type="o",lwd=2)
abline(h=1, col="red")
locator()
通过单击交叉点(并停止图表左上方的定位器),您将得到交叉点:
> locator()
$x
[1] 2.765327
$y
[1] 1.002495
然后您将添加 abline(v=2.765327)
。
如果您需要一种更加可编程的方式来查找交集,我们将不得不估计您的数据的功能。不幸的是,您没有向我们提供 PROCESS.RATIO,所以我们只能猜测您的数据是什么样的。希望数据顺利。这是一个适用于非线性数据的解决方案。正如您在上一张图表中所见,R 所做的只是在点之间画一条线。所以,我们必须在那里拟合一条曲线。在这里,我用 2 阶多项式拟合数据。如果您的数据线性度较低,您可以尝试增加阶数(此处为 2)。如果您的数据是线性的,请使用简单的 lm
。
fit <-lm(y~poly(x,2))
newx <-data.frame(x=seq(0,5,0.01))
fitline = predict(fit, newdata=newx)
est <-data.frame(newx,fitline)
plot(df1,type="o",lwd=2)
abline(h=1, col="red")
lines(est, col="blue",lwd=2)
使用这条拟合曲线,我们可以找到最接近 y=1 的点。一旦我们有了那个点,我们就可以在交叉点和 +/-k 处绘制垂直线。
cross <-est[which.min(abs(1-est$fitline)),] #find closest to 1
plot(df1,type="o",lwd=2)
abline(h=1)
abline(v=cross[1], col="green")
abline(v=cross[1]-k, col="purple")
abline(v=cross[1]+k, col="purple")
这个论坛中有很多关于定位拟合模型和一些原始数据之间的交叉点的问题。但是,就我而言,我处于一个早期项目中,我仍在评估数据。
首先,我创建了一个数据框,其中包含理想值为 1.0 的比率值。我绘制了数据框,还使用 abline()
函数在 y=1.0
处绘制了一条水平线。这条水平线和比率图在某个点相交。
plot(a$TIME.STAMP, a$PROCESS.RATIO,
xlab='Time (5s)',
ylab='Process ratio',
col='darkolivegreen',
type='l')
abline(h=1.0,col='red')
我的目标是找到交点,比如x
并在x±k
画两条垂直线,如abline(v=x-k)
和abline(v=x+k)
其中,k是某个带容忍度。
在绘图上应用网格并不是一个真正的选择,因为该绘图将成为多面板绘图的一部分。而且,由于比率数据布局非常紧凑,情节不会太可读。最后,x±k
在我与领域专家的讨论中将非常有价值。
你能指导我如何实现吗?
这里有两种解决方法。第一个使用 locator()
,如果您没有太多要制作的图表,它将很有用:
x <- 1:5
y <- log(1:5)
df1 <-data.frame(x= 1:5,y=log(1:5))
k <-0.5
plot(df1,type="o",lwd=2)
abline(h=1, col="red")
locator()
通过单击交叉点(并停止图表左上方的定位器),您将得到交叉点:
> locator()
$x
[1] 2.765327
$y
[1] 1.002495
然后您将添加 abline(v=2.765327)
。
如果您需要一种更加可编程的方式来查找交集,我们将不得不估计您的数据的功能。不幸的是,您没有向我们提供 PROCESS.RATIO,所以我们只能猜测您的数据是什么样的。希望数据顺利。这是一个适用于非线性数据的解决方案。正如您在上一张图表中所见,R 所做的只是在点之间画一条线。所以,我们必须在那里拟合一条曲线。在这里,我用 2 阶多项式拟合数据。如果您的数据线性度较低,您可以尝试增加阶数(此处为 2)。如果您的数据是线性的,请使用简单的 lm
。
fit <-lm(y~poly(x,2))
newx <-data.frame(x=seq(0,5,0.01))
fitline = predict(fit, newdata=newx)
est <-data.frame(newx,fitline)
plot(df1,type="o",lwd=2)
abline(h=1, col="red")
lines(est, col="blue",lwd=2)
cross <-est[which.min(abs(1-est$fitline)),] #find closest to 1
plot(df1,type="o",lwd=2)
abline(h=1)
abline(v=cross[1], col="green")
abline(v=cross[1]-k, col="purple")
abline(v=cross[1]+k, col="purple")