R 如何用曲线和平滑线连接点

R 如何用曲线和平滑线连接点,r,plot,line,smooth,R,Plot,Line,Smooth,我有ctlns列表,我正在尝试生成一些数据的可视化 ctlns<-list(structure(list(level = 10, x = c(0.101666666666667, 0.06, 0.0385714285714286, 0.035, 0.035, 0.035, 0.04, 0.0433333333333333, 0.05, 0.0516666666666667, 0.06, 0.0606416584402764, 0.0606416584402764, 0.0766666

我有
ctlns
列表,我正在尝试生成一些数据的可视化

ctlns<-list(structure(list(level = 10, x = c(0.101666666666667, 0.06, 
0.0385714285714286, 0.035, 0.035, 0.035, 0.04, 0.0433333333333333, 
0.05, 0.0516666666666667, 0.06, 0.0606416584402764, 0.0606416584402764, 
0.0766666666666667, 0.0766666666666667, 0.0933333333333333, 0.0933333333333333, 
0.0975, 0.11, 0.110956351152526, 0.110956351152526, 0.135, 0.135
), y = c(0.01, 0.04125, 0.06, 0.11, 0.16, 0.21, 0.26, 0.31, 0.36, 
0.41, 0.458123195380173, 0.46, 0.51, 0.56, 0.61, 0.66, 0.71, 
0.76, 0.808123195380173, 0.81, 0.86, 0.91, 0.96)), .Names = c("level", 
"x", "y")))
我知道情节


我想平滑红色曲线的上部(y>0.2),同时保持一些曲线结构(y),以回答您问题的第2部分:

lines(lowess(ctlns[[1]]$x[ctlns[[1]]$y<0.2],
            ctlns[[1]]$y[ctlns[[1]]$y<0.2]), lwd=2, col="darkblue")

line(lowess(ctlns[[1]]$x[ctlns[[1]]]$y您可能希望使用
xspline
功能(或者
grid.xspline
如果使用网格图形)

您可以对数据进行一些预平滑处理,这也有助于:

tmp.x <- ctlns[[1]]$x
tmp.y <- ctlns[[1]]$y

tmp <- cumsum( c(TRUE, head(tmp.x,-1) != tail(tmp.x,-1) ) )

tmp2.x <- tapply( tmp.x, tmp, mean )
tmp2.y <- tapply( tmp.y, tmp, mean )

xspline( tmp2.x, tmp2.y, shape=1, border='green' )

tmp.x lowess甚至可以用于双值函数吗?如果可以的话,我会感到惊讶。试着交换
$x
$y
,做适当的调整,然后如果需要的话再交换回来。你能再解释一下吗?嗯,你知道函数的定义,以及满射/内射类型吗?看看维基百科页面。我的观点是因此,对于您的数据,
y=f(x)
不是单值的,而
x=g(y)
是单值的。您是正确的。请参阅修订版。提交之前,您必须检查您的答案。您修订的答案仍然不起作用(语法问题)很抱歉有点苛刻,但这看起来很糟糕
plot(ctlns[[1]]]x,ctlns[[1]]y,xlim=c(0,21),ylim=c(0,1),lwd=2,col=“darkred”);行(lowess(ctlns[[1]]$x,ctlns[[1]]$y,f=2/3),lwd=2,col=“darkblue”);行(lowess(ctlns[[1]]$x[ctlns[[1]]$yNo没问题。但是看起来不好是主观的,不是吗?不好是主观的。但我想你明白我在找什么。无论如何,感谢你的时间和努力。真的我不明白。当其他人发布更好的解决方案时,可能会更清楚。这太棒了!非常感谢。有没有办法平滑上半部分(y>0.2)有点像一条直线吗?@ECII,不容易只使用
xspline
。我尝试了
shape
大于1的值,有些值确实平滑了一点,但也有奇怪的工件在这样做(文档中说只使用-1和1之间的值)。您可以对数据进行预平滑,请参阅我上面的编辑,以了解一种可能性。太好了。非常感谢。这正是我所需要的。您介意解释一下您的预平滑吗?
tmp
向量仅捕获向量中相邻的x值也具有相同值的情况。因此,我们只取y值的平均值进行复制编辑x(但仅相邻的副本)。
lines(lowess(ctlns[[1]]$x[ctlns[[1]]$y<0.2],
            ctlns[[1]]$y[ctlns[[1]]$y<0.2]), lwd=2, col="darkblue")
 ids <- duplicated(ctlns[[1]]$x) & ctlns[[1]]$y < 0.25
 lines(ctlns[[1]]$x[ids],ctlns[[1]]$y[ids], lwd=4, col="darkblue")
plot( ctlns[[1]], type='l', col='red' )
xspline( ctlns[[1]], shape=1, border='blue' )
tmp.x <- ctlns[[1]]$x
tmp.y <- ctlns[[1]]$y

tmp <- cumsum( c(TRUE, head(tmp.x,-1) != tail(tmp.x,-1) ) )

tmp2.x <- tapply( tmp.x, tmp, mean )
tmp2.y <- tapply( tmp.y, tmp, mean )

xspline( tmp2.x, tmp2.y, shape=1, border='green' )
fit <- loess( tmp.y ~ tmp.x+tmp )
tmp3.y <- tapply( fitted(fit), tmp, mean )
xspline( tmp2.x, tmp3.y, shape=1, border='orange' )