当前位置:  开发笔记 > 编程语言 > 正文

R-定位两条曲线的交点

如何解决《R-定位两条曲线的交点》经验,为你挑选了1个好方法。

在此论坛中,有很多关于在拟合模型和某些原始数据之间找到交点的问题。但是,就我而言,我处于早期阶段,我仍在评估数据。

首先,我创建了一个数据框,其中包含一个理想值应为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在我与领域专家的讨论中将非常有价值。

您能指导我如何实现这一目标吗?



1> Pierre Lapoi..:

这是两个解决方案。第一个使用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)。如果您的数据是线性的,请使用simple 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")

推荐阅读
mobiledu2402851373
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有