2013-01-13 25 views
7

通过点绘制一个二次样条?基于这个大问题的晶格

plot(rnorm(120), rnorm(120), col="darkblue", pch=16, xlim=c(-3,3), ylim=c(-4,4)) 
points(rnorm(120,-1,1), rnorm(120,2,1), col="darkred", pch=16) 
points(c(-1,-1.5,-3), c(4,2,0), pch=3, cex=3) 
xspline(c(-1,-1.5,-3), c(4,2,0), shape = -1) 

Should look like that:

这里是类似的数据,更恰当地格式化为lattice情节:

dat <- data.frame(x=c(rnorm(120), rnorm(120,-1,1)), 
        y=c(rnorm(120), rnorm(120,2,1)), 
        l=factor(rep(c('B','R'),each=120)) 
) 
spl <- data.frame(x=c(-1,-1.5,-3), 
        y=c(4,2,0) 
) 

这里是链接的问题给予了什么,翻译为lattice

xyplot(y ~ x, 
     data=dat, 
     groups=l, 
     col=c("darkblue", "darkred"), 
     pch=16, 
     panel = function(x, y, ...) { 
     panel.xyplot(x=spl$x, y=spl$y, pch=3, cex=3) 
     ## panel.spline(x=spl$x, y=spl$y)    ## Gives an error, need at least four 'x' values 
     panel.superpose(x, y, ..., 
         panel.groups = function(x, y, ...) { 
          panel.xyplot(x, y, ...) 
         } 
     ) 
     }, 
     xlim=c(-3,3), ylim=c(-4,4) 
) 

enter image description here

+1

这个问题产生了一些很好的答案。 “格子”阴谋中棘手的事情之一是如何恰当地注释现有的阴谋。有许多技术可以应用于原始功能或过度现有的功能。 –

+1

无论您是否在我的回答中采用了具体的实现,['grid.xspline()'](http://stat.ethz.ch/R-manual/R-patched/library/grid/html/grid .xspline.html)函数可能会派上用场...... –

+0

@ JoshO'Brien确实,'grid.xspline()'也适用于普通的'lattice'代码。 –

回答

4

这里的一个线对线 '翻译' 的图形解决方案的成晶格。 (翻译的直接性可以通过由latticeExtra包提供的 +运营商来实现,参见?layer以获得其使用的细节。)

最后行调用grid.xspline(),将图形功能xspline()的精确网格类似物。

library(lattice) 
library(grid) 
library(latticeExtra) 

xyplot(rnorm(120)~rnorm(120), pch=16, col="darkblue", 
     xlim = c(-3.1, 3.1), ylim = c(-4.1, 4.1)) + 
xyplot(rnorm(120,2,1) ~ rnorm(120,-1,1), pch=16, col="darkred") + 
xyplot(c(4,2,0) ~ c(-1,-1.5,-3), pch=3, cex=3) + 
layer(grid.xspline(c(-1,-1.5,-3), c(4,2,0), shape = -1, default.units="native")) 

网格的一个奇特的细节做在上述最终线弹出:像几个其它的其低层次线绘图功能,grid.xspline()默认为"npc"单元代替通常期望的"native"单元作为由grid.points()等诸多grid.*()功能的默认设置。显然,这是很容易改变---一旦你意识到这一点!)

enter image description here

+0

'latticeExtra'是我没有用过的东西。我会调查它,尽管我更喜欢“lattice”的“回调”本质。 –

+0

爱那个格子的答案! –

+0

+1这个伟大的答案!我相当肯定,这可以推广到任何基本图形数学|统计图形函数。我的意思是每当你需要基地的东西时,你会发现网格中的同源。 – agstudy

0

这里是一个花板从Deepayan萨卡

panel.smooth.spline <- function(x, y, 
           w=NULL, df, spar = NULL, cv = FALSE, 
           lwd=plot.line$lwd, lty=plot.line$lty,col, 
           col.line=plot.line$col,type, ...) 
{ 
    x <- as.numeric(x) 
    y <- as.numeric(y) 
    ok <- is.finite(x) & is.finite(y) 
    if (sum(ok) < 1) 
    return() 
    if (!missing(col)) { 
    if (missing(col.line)) 
     col.line <- col 
    } 
    plot.line <- trellis.par.get("plot.line") 
    spline <- smooth.spline(x[ok], y[ok], 
          w=w, df=df, spar = spar, cv = cv) 
    pred = predict(spline,x= seq(min(x),max(x),length.out=150)) 
    panel.lines(x = pred$x, y = pred$y, col = col.line, 
       lty = lty, lwd = lwd, ...) 
    panel.abline(h=y[which.min(x)],col=col.line,lty=2) 
} 
+0

这可能会解决我实际想解决的问题,但不适用于此示例:'使用数据包1的错误至少需要4个唯一的'x'值 - 与'panel.spline'一样。 –

3

的变化这是一个有点棘手,但工作。

plot(rnorm(120), rnorm(120), col="darkblue", pch=16, xlim=c(-3,3), ylim=c(-4,4)) 
points(rnorm(120,-1,1), rnorm(120,2,1), col="darkred", pch=16) 
points(c(-1,-1.5,-3), c(4,2,0), pch=3, cex=3) 

我使用xspline而不产生绘制

dd <- xspline(c(-1,-1.5,-3), c(4,2,0), shape = -1,draw=FALSE) 

然后我使用产生WITN panel.lines

library(lattice) 
xyplot(y ~ x, 
     data=dat, 
     groups=l, 
     col=c("darkblue", "darkred"), 
     pch=16, 
     panel = function(x, y, ...) { 
     panel.xyplot(x=spl$x, y=spl$y, pch=3, cex=3) 
     panel.lines(dd$x,dd$y) 
     panel.superpose(x, y, ..., 
         panel.groups = function(x, y, ...) { 
          panel.xyplot(x, y, ...) 
         } 
     ) 
     }, 
     xlim=c(-3,3), ylim=c(-4,4) 
) 

enter image description here

+0

不错的解决方案,但我不喜欢它需要基地绘图功能的工作。 –

+0

@MatthewLundberg谢谢。但为什么 ?我好奇。因为它产生的基地?在我称之为基本情节(以“不可见”方式)的xspline包装中,是否可以接受? – agstudy

+0

我正在寻找避免基本图形功能。如果我没有得到比我自己的答案更好的东西,我会接受这一点,因为它确实有效。 –

2

我终于找到了解决这一点,基于在这个问题的答案:Quadratic spline

使用包splines

更换panel.splines( ... )(注释掉以上)使用此代码:

  local({ 
      model <- lm(y ~ bs(x, degree=2), data=spl) 
      x0 <- seq(min(spl$x), max(spl$x), by=.1) 
      panel.lines(x0, predict(model, data.frame(x=x0))) 
     }) 

enter image description here

乔什 - 奥布莱恩的指教,grid.xspline()可替代被注释掉的panel.splines( ... )一行,导致如基本问题中的确切情节,linke d以上(除了边缘):

  grid.xspline(spl$x, spl$y, shape = -1, default.units="native") 

enter image description here

+0

如果你对你的解决方案感到满意,你可以接受它:) – agstudy

+0

@agstudy它不是很可读,而且在接受我自己的答案时没有百分比。 –

+0

哇。您从所引用链接的答案或评论中得到了答案。你是比我更好的人 –

3

这不是一个解决方案,通过ATTE在ggplot2中使用Josh解决方案grid.xspline。我认为在ggplot2/lattice之间取平行是很有趣的。

enter image description here

## prepare the data 
dat <- data.frame(x=c(rnorm(120), rnorm(120,-1,1)), 
       y=c(rnorm(120), rnorm(120,2,1)), 
       l=factor(rep(c('B','R'),each=120)) 
) 
spl <- data.frame(x=c(-2,-1.5,-3), 
        y=c(4,2,0) 
) 
## prepare the scatter plot 
library(ggplot(2)) 
p <- ggplot(data=dat,aes(x=x,y=y,color=l))+ 
    geom_point()+ 
    geom_point(data=spl,aes(x=x,y=y),color='darkred',size=5) 
library(grid) 
ff <- ggplot_build(p) 

我的想法是使用由GGPLOT2产生鳞,在相同的面板比散点图来创建花键。我个人觉得这很棘手,我希望有人提供更好的解决方案。

xsp.grob <- xsplineGrob(spl$x, spl$y, 
         vp=viewport(xscale =ff$panel$ranges[[1]]$x.range, 
            yscale = ff$panel$ranges[[1]]$y.range), 
         shape = -1, default.units="native") 
p 
grid.add(gPath='panel.3-4-3-4',child=xsp.grob)