10

ggplot() オブジェクトを変数に割り当てることで、オブジェクトを簡単に再利用し、プロットごとに冗長なコードを使用することなく、geom レイヤーのバリエーションを含むプロットの複数のバージョンを作成できます。しかし、グローバルな美的マッピングを交換しながら、geom レイヤーを再利用する方法があるかどうか疑問に思っていました。

これの使用例の 1 つは、同じ幾何学的表現で複数のプロットを作成したいが、次元の 1 つにマップされた変数を交換したいということです。もう 1 つの使用例は、データが 2 つの異なるデータ フレームから取得される 2 つのプロットを作成することです。

これを行う直感的な方法は、1) ggplot() オブジェクトを割り当てずに geom レイヤーの組み合わせを変数に保存するか、2) 別のオブジェクトを追加して変数内の既存の ggplot() オブジェクトのデータと美学をオーバーライドすることです。 ggplot() オブジェクト。ただし、これらのいずれかを行うとエラーが発生します(1の場合-「バイナリ演算子への非数値引数、2の場合-「プロットにoを追加する方法がわかりません」)。

たとえば、次のプロットで、gg 変数を再利用したいが、x 変数をデータフレーム内の別のものに再マップしたいとします。

  dsamp <- diamonds[sample(nrow(diamonds), 1000), ]
  gg <- 
    (ggplot(data = dsamp, aes(x = carat, y = price, color = clarity))
     + geom_point()
     + facet_wrap(~ cut))
  print(gg)

実際には、プロット定義は 3 行をはるかに超える長さになる可能性があるため、これがコードのメンテナンスの煩わしさになり始めます。

4

2 に答える 2

20

美学に関連する変数とプロットに関連するデータの交換はどちらも簡単です。gg質問で定義した を使用しaesて、それ自体を使用して美学を変更します。

gg + aes(x=table, y=depth)

プロットに使用するデータを変更するには、%+%演算子を使用します。

dsamp2 <- head(diamonds, 100)
gg %+% dsamp2
于 2012-08-17T21:02:54.307 に答える
3

ジョランが言ったように、私は推測しています...しかし:

ggplot2 オブジェクトを編集するか (悪い考えです)、関数でプロットをラップするかの 2 つのうちのいずれかを行うことができます。

次のデータとプロット呼び出しを使用できます。

dat <- data.frame(x=1:10, y=10:1, z=1, a=letters[1:2], b=letters[3:4])

# p <- ggplot(dat, aes_string(x=xvar, y=yvar, color=colorvar)) + geom_point()

aes_string列の名前ではなく変数を渡すことができるように使用したことに注意してください。

xvar <- 'y'
yvar <- 'z'
colorvar <- 'a'

p <- ggplot(dat, aes_string(x=xvar, y=yvar, color=colorvar)) + geom_point()

の構造pは以下のとおりです。編集の整理はお任せします。代わりに、ggplot を関数でラップします。

plotfun <- function(DF, xvar, yvar, colorvar) {
  ggplot(DF, aes_string(x=xvar, y=yvar, color=colorvar)) + geom_point()
}

p <- plotfun(dat, 'z', 'x', 'a')
p

str(p)


 List of 8
     $ data       :'data.frame':    10 obs. of  5 variables:
      ..$ x: int [1:10] 1 2 3 4 5 6 7 8 9 10
      ..$ y: int [1:10] 10 9 8 7 6 5 4 3 2 1
      ..$ z: num [1:10] 1 1 1 1 1 1 1 1 1 1
      ..$ a: chr [1:10] "a" "b" "a" "b" ...
      ..$ b: chr [1:10] "c" "d" "c" "d" ...
     $ layers     :List of 1
      ..$ :Classes 'proto', 'environment' <environment: 0x34d5628> 
     $ scales     :Reference class 'Scales' [package "ggplot2"] with 1 fields
      ..$ scales: list()
      ..and 20 methods, of which 9 are possibly relevant:
      ..  add, clone, find, get_scales, has_scale, initialize, input, n, non_position_scales
     $ mapping    :List of 3
      ..$ x     : symbol y
      ..$ y     : symbol x
      ..$ colour: symbol a
     $ options    :List of 1
      ..$ labels:List of 3
      .. ..$ x     : chr "z"
      .. ..$ y     : chr "x"
      .. ..$ colour: chr "a"
     $ coordinates:List of 1
      ..$ limits:List of 2
      .. ..$ x: NULL
      .. ..$ y: NULL
      ..- attr(*, "class")= chr [1:2] "cartesian" "coord"
     $ facet      :List of 1
      ..$ shrink: logi TRUE
      ..- attr(*, "class")= chr [1:2] "null" "facet"
     $ plot_env   :<environment: R_GlobalEnv> 
     - attr(*, "class")= chr "ggplot"
于 2012-08-17T19:56:04.413 に答える