2013-12-17 20 views
10

ggplotを使用して、グラフタイルをパネルで表示したいと思いますが、パネルごとに同じ高さのタイルを使用します。 私はこのグラフを持っている:geom_tileとfacet_grid/facet_wrapと同じ高さのタイル

dataSta <- list(sites=rep(paste("S", 1:31),each=12), month=rep(1:12,31), value=round(runif(31*12, min=0, max=3000)), panel=c(rep("Group 1",16*12),rep("Group 2", 12*12), rep("Group 3", 3*12))) 

    library(ggplot2) 
    library(grid) 
    base_size <- 9 

    windows() 
    ggplot(data.frame(dataSta), aes(factor(month), sites)) + 
     geom_tile(aes(fill = value), colour = "black")+ 
     facet_wrap(~panel, scale="free_y", nrow=3)+ 
     theme_grey(base_size = base_size) + 
     labs(x = "",y = "") + 
     scale_x_discrete(expand = c(0, 0)) +  
     scale_y_discrete(expand = c(0, 0)) +  
     theme(legend.title = element_blank(), 
      axis.ticks = element_blank(),  
      axis.text.x = element_text(size = base_size *0.8, hjust = 0), 
      panel.margin = unit(0,"lines"), 
      strip.text = element_text(colour="red3", size=10, face=2)) 

enter image description here

しかし、タイルの高さがパネル間で異なります。私はfacet_grid使用しよう:タイルの高さと

windows() 
ggplot(data.frame(dataSta), aes(factor(month), sites)) + 
    geom_tile(aes(fill = value), colour = "black")+ 
    facet_grid(panel~., scales="free_y", space="free")+ 
    theme_grey(base_size = base_size) + 
    labs(x = "",y = "") + 
    scale_x_discrete(expand = c(0, 0)) +  
    scale_y_discrete(expand = c(0, 0)) +  
    theme(legend.title = element_blank(), 
     axis.ticks = element_blank(),  
     axis.text.x = element_text(size = base_size *0.8, hjust = 0), 
     panel.margin = unit(0,"lines"), 
     strip.text = element_text(colour="red3", size=10, face=2)) 

enter image description here 問題は解決されていますが、パネルのラベル(グループ1 ...グループ3)は、パネルの上にはありません。 facet_gridでパネルラベルの位置を変更することは可能ですか?またはfacet_gridとfacet_wrapを結合しますか? お世話になりました。

+0

可能な複製:https://stackoverflow.com/a/32733035/7886302 – Undo

答えて

16

プロットする前にggplotに含まれているものを確認し、それに応じてパネルを再スケーリングすることができます。

g <- ggplot_build(p) 
## find out how many y-breaks are in each panel 
## to infer the number of tiles 
vtiles <- sapply(lapply(g$panel$ranges, "[[", "y.major"), length) 

## convert the plot to a gtable object 
gt <- ggplot_gtable(g) 
## find out which items in the layout correspond to the panels 
## we refer to the "t" (top) index of the layout 
panels <- gt$layout$t[grepl("panel", gt$layout$name)] 
## replace the default panel heights (1null) with relative sizes 
## null units scale relative to each other, so we scale with the number of tiles 
gt$heights[panels] <-lapply(vtiles, unit, "null") 
## draw on a clean slate 
library(grid) 
grid.newpage() 
grid.draw(gt) 

enter image description here

+0

ありがとう、それは私が探しているものです!それはとてもうまくいく! –

0

それは実際にあなたがspace = "free_y"を設定することができますfacet_gridの一部であり、簡単に解決策を見つけるために私にいくつかの時間がかかりました。詳細はrecent questionです。

+0

それが答えとして残っている場合は、質問を参照してここにreprexを使用して完全な解決策を投稿し、別の質問にリンクしないでください。後者はコメントの方が良いです。 –

関連する問題