如何使用弯曲和平滑的线条连接点

时间:2013-01-09 13:57:00

标签: 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.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")))

然后我,

 plot(ctlns[[1]]$x,ctlns[[1]]$y, xlim=c(0,.21), ylim=c(0,1), lwd=2, type="l", col="darkred" )

我得到了情节 enter image description here

我想平滑红色曲线的上半部分(y> 0.2),同时保持一些弯曲结构(y <0.2)

lines(lowess(ctlns[[1]]$x,ctlns[[1]]$y,f=2/3), lwd=2, col="darkblue")

对前一部分做得很好,但删除了曲线的下半部分。我有以下问题:

  1. 为什么会这样?
  2. 如何保存和平滑红色曲线的下半部分?或者可以组合曲线/平滑线?
  3. 忽略红色曲线,我如何根据蓝色曲线数据指示lowess来推断这些值,直到y = 0?
  4. 与agstudy讨论后编辑

    由于红线的弯曲性质,我认为我需要的可能是平滑y~x的功能,而是将点x, y与某种曲线连接起来的函数。这些点应该按照它们出现在它们的向量中的顺序连接(x[1]y[1],依此类推......)

    enter image description here

    这可能吗?

2 个答案:

答案 0 :(得分:5)

您可能希望使用xspline函数(如果使用网格图形,则使用grid.xspline。)

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' )

答案 1 :(得分:2)

回答你问题的第2部分:

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

对于你问题的第一部分,我猜这个算法的目的是处理函数(术语的数学定义),它会删除x上的重复项。

OP评论后

编辑

对我来说这很好,至少我以最佳方式使用LOESS功能。 如果要加入所有部分,可以为创建问题的点创建一个小行。

 ids <- duplicated(ctlns[[1]]$x) & ctlns[[1]]$y < 0.25
 lines(ctlns[[1]]$x[ids],ctlns[[1]]$y[ids], lwd=4, col="darkblue")

enter image description here