2

facet_grid と facet_wrap の間の一種の「ハイブリッド」レイアウトでプロットを作成しようとしています。

例:

library(reshape2)
library(ggplot2)

data(diamonds)

# sample and reshape diamond dataset
diamonds_l <- melt(diamonds[sample(1:nrow(diamonds), 200), 
                            c("cut", "depth", "table", "price", "x")],
                   id.vars = c("cut","x"))

これは私が望むプロットの配置です(列と深さの品質、表、行の価格)

ggplot( diamonds_l, aes( x = value, y = x, colour= cut))+
  geom_point( ) +
  facet_wrap( variable ~  cut, scales = "free_x", nrow=3) 

ここに画像の説明を入力

ただし、facet_grid 設計 (列/行ごとに 1 つのヘッダーのみ) を好みますが、scales = "free_x" はこのレイアウトでは機能しません

ggplot( diamonds_l, aes( x = value, y = x, colour= cut))+
  geom_point( ) +
  facet_grid(variable ~  cut, scales = "free_x") 

ここに画像の説明を入力

ここでは機能しますが、それは私が望む配置ではありません (行としての品質)

ggplot( diamonds_l, aes( x = value, y = x, colour= cut))+
  geom_point( ) +
  facet_grid(cut ~ variable, scales = "free_x")

ここに画像の説明を入力

うまくいかない理由はわかりましたが、回避策があるかどうか疑問に思っていましたか?

ありがとう!

ファビアン

4

1 に答える 1

3

掘り下げた後、なんとかトリックを引っ張ることができました。ここ(@baptiste、@Roland) とここ(@Sandy Muspratt)から借用したコードの一部。恐ろしく見えますが、基本的には、低レベルの操作を介して、最初のプロットからテキスト ストリップを削除/名前変更しています。

p <- ggplot( diamonds_l, aes( x = value, y = x, colour= cut))+
  geom_point( ) +
  facet_wrap( variable ~ cut, scales = "free_x", nrow = 3) 

library(gridExtra)
gt <- ggplotGrob(p)
panels <- grep("panel", gt$layout$name)
top <- unique(gt$layout$t[panels])
gt <- gt[-(top[-1]-1), ]

gg <- gt$grobs      
strips <- grep("strip_t", names(gg))
labels <- levels(diamonds_l$cut)
for(ii in seq_along(labels))  {
  modgrob <- getGrob(gg[[strips[ii]]], "strip.text", 
                     grep=TRUE, global=TRUE)
  gg[[strips[ii]]]$children[[modgrob$name]] <- editGrob(modgrob,label=labels[ii])
}
gt$grobs <- gg
grid.newpage()
grid.draw(gt)

ここに画像の説明を入力

于 2015-06-24T12:12:29.927 に答える