ggplot2のファセットに一般的なラベルをどのように追加しますか?


84

私はしばしばファセットの数値を持っています。軸のタイトルと同様に、補足タイトルでこれらのファセット値を解釈するのに十分な情報を提供したいと思います。ラベラーオプションは多くの不要なテキストを繰り返し、長い可変タイトルには使用できません。

助言がありますか?

デフォルト:

test<-data.frame(x=1:20, y=21:40, facet.a=rep(c(1,2),10), facet.b=rep(c(1,2), each=20))
qplot(data=test, x=x, y=y, facets=facet.b~facet.a)

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

私が好きなもの:

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

ggplotでできる最善のこと:

qplot(data=test, x=x, y=y)+facet_grid(facet.b~facet.a, labeller=label_both)

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

@Hendyで示されているように 、次のようになります。ggplot2プロットに2番目のy軸を追加します-完璧にします


1
聖なる牛。私はちょうどこれを探していました、グーグルを通してこれを見つけました...そして今それが1分前に尋ねられたのを見てください。この質問は、タイトルがそうでないことを暗示しているにもかかわらず、彼のコメントに基づいて同じことを尋ねているようです。説明するのに最適なモックアップ。これはまさに私の問題です。数値ファセットのカテゴリを説明する必要がなければいいのですが。グラフは、ファセット変数が何であるかを説明する単純なラベルでそれ自体を説明する必要があります。
ヘンディ2012

3
主要なggplot開発者の1人であるWinstonChang(彼のSOハンドルがわからない)に電子メールで問い合わせました。彼はこれが現在オプションであるとは思わないが、それを追加することを検討するかもしれない。彼は私がgithubに問題を追加することを提案したので、私はそうしました
Hendy

1
これがメーリングリストに載ったようで、ウィンストンは私に知らせました。彼は、トップラベル用にこれを一般的に実装したブランチを作成しました。こちらのスレッドをご覧ください。@hadley:その通りです。一般的にどれだけ難しいかわかりません。これが決して起こらない場合... ggplotに対する私の感謝の気持ちはまだ続いています:)
Hendy

1
ある時点で、R / ggplot2をラングリングするのをやめ、画像エディターを使用して必要な変更を加えます。
アンディ

2
ここでのベストプラクティスに関する最新情報はありますか?
アーサー・イップ

回答:


49

最新のものggplot2gtable内部で使用されているため、図を変更するのは非常に簡単です。

library(ggplot2)
test <- data.frame(x=1:20, y=21:40, 
                   facet.a=rep(c(1,2),10), 
                   facet.b=rep(c(1,2), each=20))
p <- qplot(data=test, x=x, y=y, facets=facet.b~facet.a)

# get gtable object
z <- ggplotGrob(p)

library(grid)
library(gtable)
# add label for right strip
z <- gtable_add_cols(z, unit(z$widths[[7]], 'cm'), 7)
z <- gtable_add_grob(z, 
                     list(rectGrob(gp = gpar(col = NA, fill = gray(0.5))),
                          textGrob("Variable 1", rot = -90, gp = gpar(col = gray(1)))),
                     4, 8, 6, name = paste(runif(2)))

# add label for top strip
z <- gtable_add_rows(z, unit(z$heights[[3]], 'cm'), 2)
z <- gtable_add_grob(z, 
                     list(rectGrob(gp = gpar(col = NA, fill = gray(0.5))),
                          textGrob("Variable 2", gp = gpar(col = gray(1)))),
                     3, 4, 3, 6, name = paste(runif(2)))

# add margins
z <- gtable_add_cols(z, unit(1/8, "line"), 7)
z <- gtable_add_rows(z, unit(1/8, "line"), 3)

# draw it
grid.newpage()
grid.draw(z)

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

もちろん、ストリップラベルを自動的に追加する関数を作成することもできます。の将来のバージョンにggplot2は、この機能が含まれる可能性があります。でもわからない。


-バージョン0.9.3.1の時点で、これが依然として最もクリーンなアプローチであるかどうか疑問に思っています。私は何かが表示されないよう、最新のドキュメントで「このfuctionality」のように見えるdocs.ggplot2.org/0.9.3.1
yosukesabai

1
バージョン0.9.3.1はggplotGrob()、と同じものを提供しggplot_gtable(ggplot_build())ます。これが今でも最善の方法だと思います。
kohske 2013年

1
私が間違っていなければ、一部の機能が廃止されたため、このソリューションは無効になりました。
remi.b 2016年

1
@ Remi.b今すぐお試しください
rawr 2016

3
これは、ggplot23.2.1およびR3.6.1では機能しません。エラーメッセージはありませんが、結果のプロットにラベルが表示されません。
Calimo

5

それを行うためのより良い方法があるかもしれませんが、あなたはすることができます:

fac1 = factor(rep(c('a','b'),10))
fac2 = factor(rep(c('a','b'),10))
data = data.frame(x=1:10, y=1:10, fac1=fac1, fac2=fac2)
p = ggplot(data,aes(x,y)) + ggplot2::geom_point() + 
facet_grid(fac1~fac2)
p + theme(plot.margin = unit(c(1.5,1.5,0.2,0.2), "cm"))
grid::grid.text(unit(0.98,"npc"),0.5,label = 'label ar right', rot = 270) # right
grid::grid.text(unit(0.5,"npc"),unit(.98,'npc'),label = 'label at top', rot = 0)   # top

1

kohskeによって概説された方法に加えて、変更することによって追加されたボックスに境界線を追加できます

col=NA

col=gray(0.5), linetype=1

また、変更します

fill=gray(0.5)

にとって

fill=grey(0.8)

そして

gp=gpar(col=gray(1))

gp=gpar(col=gray(0))

新しいバーをファセットラベルと一致させたい場合

すなわち

z <- gtable_add_grob(z, 
      list(rectGrob(gp = gpar(col = gray(0.5), linetype=1, fill = gray(0.8))),
      textGrob("Variable 1", rot = -90, gp = gpar(col = gray(0)))),
      4, 8, 6, name = paste(runif(2)))
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.