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)

そのように見えるはずです:

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

ここに画像の説明を入力してください

4

5 に答える 5

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

(グリッドの1つの独特の詳細が上の最後の行に表示されます。他のいくつかの低レベルの線画関数と同様に、grid.xspline()デフォルトで、他の多くの関数でデフォルトとして使用される"npc"通常の単位ではなく、単位になります。明らかに、これは簡単です。変更するのに十分---気づいたら!)"native"grid.points()grid.*()

ここに画像の説明を入力してください

于 2013-01-14T02:14:58.200 に答える
3

grid.xsplineでJoshソリューションを使用しようとするため、これはソリューションではありませんggplot2。ggplot2/latticeを比較するのは面白いと思います。

ここに画像の説明を入力してください

## 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)
于 2013-01-14T10:35:31.243 に答える
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)

次に、生成されたポイントを使用します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)
)

ここに画像の説明を入力してください

于 2013-01-13T16:34:58.713 に答える
2

この質問への答えに基づいて、私はついにこれに対する解決策を見つけました: 二次スプライン

パッケージを使用する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)))
         })

ここに画像の説明を入力してください

Josh O'Brienの優れた提案からgrid.xspline()、コメントアウトされたpanel.splines(...)行を置き換えることができます。これにより、上記のリンク先の基本的な質問と同じように正確なプロットが得られます(余白を除く)。

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

ここに画像の説明を入力してください

于 2013-01-13T17:30:16.663 に答える
0

これは、DeepayanSarkarのスプラインパネルのバリエーションです。

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)
}
于 2013-01-13T16:09:39.597 に答える