2013-01-13 52 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)