web-dev-qa-db-ja.com

ggplot2:多変数facet_wrapラベルを1行に配置

Facet_wrapを使用して散布図を分割します

facet_wrap(x~y+z)

これにより、私の場合、必要に応じて22のプロットが生成されます。ただし、これらの22の各プロットのラベルは3行(x、y、z)で表示され、ウィンドウ内のスペースを不必要に消費し、プロットを小さな領域に押しつぶします。プロットのサイズを大きくしたいです。変数yとzは短いので、2つではなく同じ行に表示したいと思います。

ラベラーのオプションを調べましたが、どれも私が望むことをするようには見えません。ここで提案をいただければ幸いです。

17
beeprogrammer

この場合、label_wrap_gen()を考慮することもできます:

p <- ggplot(mtcars, aes(wt,mpg)) + geom_point() 
p + facet_wrap(cyl~am+vs, labeller = label_wrap_gen(multi_line=FALSE))

詳細については、 here および here も参照してください。

19
nulptr

ラベラー関数を使用してこれを行う方法はわかりませんが、別のオプションは、3つのカテゴリ変数すべてをファセットに使用できる単一の変数に結合するグループ化変数を作成することです。組み込みのmtcarsデータフレームとdplyrパッケージを使用して、オンザフライで新しいグループ化変数を作成する例を次に示します。それに続いて、1〜3つのファセット変数を動的に選択できる関数を使用した更新が行われます。

library(dplyr)

ggplot(mtcars %>% mutate(group = paste(cyl,am,vs, sep="-")), 
       aes(wt,mpg)) +
  geom_point() +
  facet_wrap(~group)

enter image description here

UPDATE:柔軟性に関するコメントに関して、以下のコードは、ユーザーが目的のデータフレームと変数名を入力できるようにする関数です。 1、2、または3列のファセット。

library(dplyr)
library(lazyeval)

mygg = function(dat, v1, v2, f1, f2=NA, f3=NA) {

  dat = dat %>% 
    mutate_(group = 
              if (is.na(f2)) {
                f1
              } else if (is.na(f3)) {
                interp(~paste(f1,f2, sep='-'), f1=as.name(f1), f2=as.name(f2))
              } else {
                interp(~paste(f1,f2,f3,sep='-'), f1=as.name(f1), f2=as.name(f2), f3=as.name(f3))
              })

  ggplot(dat, aes_string(v1,v2)) +
    geom_point() +
    facet_wrap(~group)
}

では、関数を試してみましょう。

library(vcd) # For Arthitis data frame

mygg(Arthritis, "ID","Age","Sex","Treatment","Improved")
mygg(mtcars, "wt","mpg","cyl","am")
mygg(iris, "Petal.Width","Petal.Length","Species")

enter image description here

10
eipi10