18

私の問題のサンプルデータが含まれていないことをお詫びします。サンプルのシェープファイルを簡単に作成する方法が見つかりませんでした。うまくいけば、の経験豊富なユーザーはggplot、以下の説明から私がやりたいことを見ることができます。

私が持っている:

  • サンプルプロットに関するdata.frame情報をplotid含むX var1(、、、、、、…)var2var3var4

  • Yサンプルプロットの空間情報を含むポリゴンシェープファイル

シェープファイルY(with maptools)とfortifying as data.frame Zggplot2)のインポートは正常に機能します。melt同様XX_meltedうまく機能します。merge-ingZX_meltedtoも同様にmapdf機能します。

つまり、空間情報と、、、、…</p>を含む長いdata.frame形式var1ができ ました。var2var3

次に、このデータフレームを次のようにプロットします。

pl1 <- ggplot(mapdf,aes(long,lat),group=group)
pl1 <- pl1 + geom_polygon(aes(group=group,fill=value),colour="black")
pl1 <- pl1 + facet_grid(variable ~ .)
pl1 <- pl1 + coord_equal(ratio = 1)
pl1

結果は、変数ごとに1つのパネルを持つ素晴らしいプロットです。パネルのマップは同じですが、塗りつぶしの色は変数の値によって異なります。これまで、すべてが魅力のように機能します…1つの問題があります:

変数の最小値と最大値は異なります。たとえば、から、から、、var1から、などになります。この例では、塗りつぶしの色の凡例はからになります。きれいに描かれていますが、基本的に同じ色です。05var20400var35100400var2var1var3

ファセットのパネルごとに異なる凡例を使用する方法はありますか?それとも、これは(まだ)一緒にfacet_wrapまたはfacet_gridで不可能ggplotですか?

変数ごとに個別のプロットを作成し、それらをビューポートと結合することもできますが、変数がたくさんあるため、これは大変な作業になります。

それとも、やりたいことを達成するために使用できる別のパッケージや方法はありますか?

そして、助けていただければ幸いです。:)

編集:ggplot2-packageの説明を使用して、問題を説明する例を作成しました。

ids <- factor(c("1.1", "2.1", "1.2", "2.2", "1.3", "2.3"))
values <- data.frame(
id = ids,
val1 = cumsum(runif(6, max = 0.5)),
val2 = cumsum(runif(6, max = 50))
)
positions <- data.frame(
id = rep(ids, each = 4),
x = c(2, 1, 1.1, 2.2, 1, 0, 0.3, 1.1, 2.2, 1.1, 1.2, 2.5, 1.1, 0.3,
0.5, 1.2, 2.5, 1.2, 1.3, 2.7, 1.2, 0.5, 0.6, 1.3),
y = c(-0.5, 0, 1, 0.5, 0, 0.5, 1.5, 1, 0.5, 1, 2.1, 1.7, 1, 1.5,
2.2, 2.1, 1.7, 2.1, 3.2, 2.8, 2.1, 2.2, 3.3, 3.2)
)

values <- melt(values)
datapoly <- merge(values, positions, by=c("id"))

p <- ggplot(datapoly, aes(x=x, y=y)) + geom_polygon(aes(fill=value, group=id),colour="black")
p <- p + facet_wrap(~ variable)
p

右側のパネルはvar2、マップ上ののさまざまな値を示しています。ただし、左側のパネルでは、すべてのポリゴンが同じ色になっています。すべてのパネルに1つのカラーグラデーションのみが使用されるため、これは論理的です。パネルごとに異なるカラーグラデーションを使用できますか?

4

5 に答える 5

16

現在、プロットごとに1つのスケールしか存在できません(xとyを除くすべてに対して)。

于 2010-09-28T01:32:49.860 に答える
4

グリッドの良さで

align.plots <- function(..., vertical=TRUE){
#http://ggextra.googlecode.com/svn/trunk/R/align.r
  dots <- list(...)
  dots <- lapply(dots, ggplotGrob)
  ytitles <- lapply(dots, function(.g) editGrob(getGrob(.g,"axis.title.y.text",grep=TRUE), vp=NULL))
  ylabels <- lapply(dots, function(.g) editGrob(getGrob(.g,"axis.text.y.text",grep=TRUE), vp=NULL))
  legends <- lapply(dots, function(.g) if(!is.null(.g$children$legends))
                    editGrob(.g$children$legends, vp=NULL) else ggplot2:::.zeroGrob)

  gl <- grid.layout(nrow=length(dots))
  vp <- viewport(layout=gl)
  pushViewport(vp)
  widths.left <- mapply(`+`, e1=lapply(ytitles, grobWidth),
                        e2= lapply(ylabels, grobWidth), SIMPLIFY=F)
  widths.right <- lapply(legends, function(g) grobWidth(g) + if(is.zero(g)) unit(0, "lines") else unit(0.5, "lines")) # safe margin recently added to ggplot2
  widths.left.max <- max(do.call(unit.c, widths.left))
  widths.right.max <- max(do.call(unit.c, widths.right))

  for(ii in seq_along(dots)){
    pushViewport(viewport(layout.pos.row=ii))
    pushViewport(viewport(x=unit(0, "npc") + widths.left.max - widths.left[[ii]],
                          width=unit(1, "npc") - widths.left.max + widths.left[[ii]] -
                                                 widths.right.max + widths.right[[ii]],
                          just="left"))
    grid.draw(dots[[ii]])
  upViewport(2)
  }
}



p <- ggplot(datapoly[datapoly$variable=="val1",], aes(x=x, y=y)) + geom_polygon(aes(fill=value, group=id),colour="black")
p1 <- ggplot(datapoly[datapoly$variable=="val2",], aes(x=x, y=y)) + geom_polygon(aes(fill=value, group=id),colour="black")
align.plots( p,p1)
于 2010-09-28T02:19:45.817 に答える
2

明白なことを述べるリスクがありますが、生の値ではなくパーセントで色付けする必要があるようです。次に、変換された値と凡例が 0 から 1 になります。

于 2010-09-27T20:14:35.323 に答える
1

少し変わったかもしれませんが、「価値」を因数分解してみてください。例えば:

p <- ggplot(datapoly, aes(x=x, y=y)) + geom_polygon(aes(fill=factor(value), group=id),colour="black")
p <- p + facet_wrap(~ variable)
p

ggplot2 は、因子を使用して凡例を作成します。したがって、「値」を取り、因数分解された範囲に分割する列を追加できれば、「値」を範囲に置き換えることができます。

「f」のような列を作成します。

    id variable        value   x    y f
1  1.1     val1   0.09838607 2.0 -0.5 0.09-0.13
2  1.1     val1   0.09838607 1.0  0.0 0.09-0.13
3  1.1     val1   0.09838607 1.1  1.0 0.09-0.13
4  1.1     val1   0.09838607 2.2  0.5 0.09-0.13
25 2.1     val1   0.13121347 1.0  0.0 0.13-0.20

...

次に使用します。

p <- ggplot(datapoly, aes(x=x, y=y)) + geom_polygon(aes(fill=f, group=id),colour="black")
p <- p + facet_wrap(~ variable)
p

必要なカテゴリを指定する必要があり、時間がかかる可能性があります。しかし、少なくともグラフはあなたが望むように出てきます。基本的に、データを別の列に再コーディングします。ここではいくつかの例を示します。

http://www.statmethods.net/management/variables.html

于 2010-09-27T16:45:04.980 に答える