6

現在、ggplot2 を使用して、それぞれが異なる地域に属する異なるグループの統計を比較しています。これは、R スクリプトを実行する Web アプリケーション (tikiwiki CMS + プラグイン R) を介して行われます。リージョンごとに、2 ~ 30 以上のグループを作成できます。一意の Web ページ内のすべてのデータに対して同じ R スクリプトが実行され、ページのパラメーターとして、選択した地域に応じて結果が適応されます。

現在、私はこれを持っています:

region 1: 12 groups = 12 medium facets
region 2: 3 groups = 3 **HUGE** facets
region 3: 24 groups = 24 **TINY** facets
region 4: 16 groups = 16 medium facets
...

リージョン 2

グループを減らす

リージョン 3

その他のグループ

私が望む結果は次のとおりです。

リージョン 2

ここに画像の説明を入力

リージョン 3 変更なし

facet_wrap(~data, ncol=4)を使用してグループごとにファセットを作成しているため、2 つまたは 30 以上のファセットを使用できます。私の問題は出力です.30個のファセットが小さなボックスに詰め込まれているか、2つのファセットが同じサイズのボックスに大きすぎます->上の写真を参照してください...比率を修正する方法が見つかりません(または画像出力最大幅) ただし、最終的な画像サイズは自由に保ちます。

ggplot2/R でファセットのデフォルト サイズを修正し、結果の画像のサイズをファセットの数に適応させることは可能ですか?

これが ggplot2/R で不可能な場合、コードを取得して結果を正しく表示できる javascript/jquery ライブラリはありますか (d3、...) ?

4

1 に答える 1

5

高さを相対 (「null」) ではなく物理単位 (cm など) に設定して gtable を編集できます。

require(ggplot2)
p = qplot(Sepal.Width, Sepal.Length, data=iris) + facet_wrap(~Species, ncol=1)
g = ggplotGrob(p)

panels = which(sapply(g[["heights"]], "attr", "unit") == "null")
g[["heights"]][panels] = list(unit(4, "cm"), unit(8, "cm"), unit(2, "cm"))

device.height = convertHeight(sum(g[["heights"]]), "in", valueOnly=TRUE)

pdf("test.pdf", height = device.height)
grid.draw(g)
dev.off()

ここに画像の説明を入力

編集フォローアップとして、すべてのパネルの高さと幅を固定値に設定する関数を次に示します。

freeze_panels <- function(p, draw=TRUE,
                          width=unit(5,"cm"),
                          height=unit(1,"in")){
  require(grid)
  g  <-  ggplotGrob(p)

  vertical_panels <-which(sapply(g[["heights"]], "attr", "unit") == "null")
  horizontal_panels <-which(sapply(g[["widths"]], "attr", "unit") == "null")

  g[["heights"]][vertical_panels] <- replicate(length(vertical_panels), 
                                               height, simplify=FALSE)

  g[["widths"]][horizontal_panels] <- replicate(length(horizontal_panels), 
                                               width, simplify=FALSE)

  device.height  <-  convertHeight(sum(g[["heights"]]), "in", valueOnly=TRUE)
  device.width  <-  convertWidth(sum(g[["widths"]]), "in", valueOnly=TRUE)
  if(draw){
    dev.new(height=device.height, width=device.width)
    grid.newpage()
    grid.draw(g)
  }
  invisible(g)
}



require(ggplot2)
d1 <- subset(mtcars, carb != 8)
d2 <- subset(mtcars, carb %in% c(1,2,3))
p = qplot(vs, am, data=d1) + facet_wrap(~carb)

freeze_panels(p)
freeze_panels(p %+% d2)
freeze_panels(p %+% d2 + facet_wrap(~carb, ncol=1))
于 2013-10-14T13:38:18.903 に答える