在这个论坛中有很多问题可以找到拟合模型和一些原始数据之间的交叉点。但是,在我的情况下,我正处于早期项目中,我仍在评估数据。
首先,我创建了一个包含比率值的数据框,其理想值应为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
在与域专家的讨论中非常有价值。
你能指导我如何实现这个目标吗?
答案 0 :(得分:5)
这是两个解决方案。第一个使用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")