6

ggplot2でプロットしようとしていますが、geomタイルで苦労しています。このgeomを初めて使用するとき、Hadleyのドキュメントをよく調べましたが、それでも自分が求めているものを取得することができませんでした。タイルの幅と高さの両方を調整したい。ドキュメントでタイルの幅を調整する方法を見つけましたが、高さに苦労しています。次のプロットを開始点として:

test <- data.frame(
  x = rep(c(1,3,6),2),
  y = rep(c(1,3), each = 3),
  w = rep(c(.5,2,1), 2),
  z = sample(rep(LETTERS[1:6])))

ggplot(test, aes(x=x, y=y, fill = z)) + geom_tile(aes(width = w))

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

タイルの高さも調整したいと思います。最初の「列」(x = 1)の一番下のタイルを0から1まで実行し、最初の列の一番上のタイルを1から4まで実行します。2番目の列で、一番下のタイルを実行します。 0から3まで、上部のタイルを3から4まで。最後の列では、下部を0から1.5に、上部を1.5から4にします。次のような多くのことを試しました。

test2 <- data.frame(
 x = rep(c(1,3,6),2),
 y = c(0, 0, 0, 1, 3, 1.5),
 w = rep(c(.5,2,1), 2),
 z = sample(rep(LETTERS[1:6])),
 h = c(1, 3, 1.5, 3, 1, 2.5))

ggplot(test2, aes(x=x, y=y, fill = z)) + geom_tile(aes(width = w, heigth = h))

しかし、私が探していたプロットを作成したものはありませんでした。

どんな助けでも大歓迎です。前もって感謝します!

4

2 に答える 2

8

geom_tile美学を取り、からheight=h生成yminします。これが、意図したプロットが得られない理由です。@Didzisのソリューションは非常に単純で仕事をこなせるので、私は完全にサポートしていますが、2つの理由からソリューションを使用して説明します。楽しくて、知っておくといつもいいです:)。ymax-h/2 to h/2geom_tile

目的は、プロットが期待どおりになるように、高さに応じyて位置を「生成」することです。data.frameを取得し、test2

require(plyr)
# calculate y coordinate accounting for shift in y due to h
test2 <- ddply(test2, .(x), transform, y2 = c(0, head(h,-1)) + h/2)
p <- ggplot(test2, aes(x=x, y=y2, fill = z)) + 
           geom_tile(aes(width = w, height=h))
p

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

これで、高さがきちんと生成されていることがわかります(yminとymax)

ggplot_build(p)$data

#      fill x    y PANEL group xmin xmax ymin ymax
# 1 #00BFC4 1 0.50     1     4 0.75 1.25  0.0  1.0
# 2 #619CFF 1 2.50     1     5 0.75 1.25  1.0  4.0
# 3 #00BA38 3 1.50     1     3 2.00 4.00  0.0  3.0
# 4 #F8766D 3 3.50     1     1 2.00 4.00  3.0  4.0
# 5 #B79F00 6 0.75     1     2 5.50 6.50  0.0  1.5
# 6 #F564E3 6 2.75     1     6 5.50 6.50  1.5  4.0
于 2013-03-27T10:09:42.917 に答える
6

geom_tile()で使用geom_bar()する代わりに、値としてstat="identity"使用hyます。に設定することwidth=geom_bar()できますが、無視できる警告が表示されます。

ggplot(test2,aes(x,h,fill=z))+geom_bar(stat="identity",aes(width=w))

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

于 2013-03-27T09:49:16.607 に答える