2016-04-29 4 views
3

ファセットの2つのセットでグラフを生成するための最小限のコードを次に示します。ファセットの全体的なラベル

library("ggplot2", quietly = TRUE, warn.conflicts = FALSE) 
library("RColorBrewer", quietly = TRUE, warn.conflicts = FALSE) 
val.a <- rnorm(10) 
val.b <- rnorm(10) 
val.c <- c("A","B","A","A","B","B","B","B","A","B") 
val.d <- c("D","D","E","D","E","E","E","D","D","E") 
val.e <- rnorm(10) 
maya <- data.frame(val.a,val.b,val.c,val.d,val.e) 
ggplot(maya, aes(x=val.a, y=val.b)) + 
    geom_point(shape=20,size=3, aes(colour=val.e)) + 
    facet_grid(val.c~val.d) + 
    xlab("Leonardo") + ylab("Michaelangelo") + 
    scale_colour_gradientn(colours=brewer.pal(9,"YlGnBu"), name="Splinter") 

私は名前ドナテッロとラファエルは、上部と右側の軸上にあるように、全体的なファセットラベルを追加する方法を見つけ出すことはできません。

似たような解決策を見ましたが、コードの頭や尾を作ることはできません。私の謎に答えてほしいですか?

Similar questionここでは、私は2つ以上のファセットを持っていれば失敗します。ラベルはグラフのどこかに表示されます。一般的なケースでこの作業を行う方法はありますか?

私は上記のリンクでrawrのソリューションを試しましたが、それは複数の列の同じ場所で終了しました。以下は、rawrのソリューションに更新されたコードですが、予期せずにラベルを生成しています(解決策を理解していないため私のために)。

library("ggplot2", quietly = TRUE, warn.conflicts = FALSE) 
library("RColorBrewer", quietly = TRUE, warn.conflicts = FALSE) 
val.a <- rnorm(20) 
val.b <- rnorm(20) 
val.c <- c("A","B","C","D","E","F","G","H","I","J") 
val.d <- c("A","B","C","D","E","F","G","H","I","J") 
val.e <- rnorm(20) 
maya <- data.frame(val.a,val.b,val.c,val.d,val.e) 
p <- ggplot(maya, aes(x=val.a, y=val.b)) + geom_point(shape=20,size=3, aes(colour=val.e)) + facet_grid(val.c~val.d) + xlab("Leonardo") + ylab("Michaelangelo") + scale_colour_gradientn(colours=brewer.pal(9,"YlGnBu"), name="Splinter") 
z <- ggplotGrob(p) 

library(grid) 
library(gtable) 
# add label for right strip 
z <- gtable_add_cols(z, unit(z$width[[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) 

誰かが親切に私には、一般的なファセットラベルがどうあるべきか広い、それを伝えるのコードの一部を指摘するだろうしてください?

+1

あなたはおそらくなら、 'facet_grid(val.c + "ラファエル" 〜 "ドナテッロ" + val.d)'で何かを得ることができますが、単一全体のストリップラベルを取得しますあなたが面取りラベラーの制約を破ることができない限り、四角形を描くことでそれをハックする必要があります。また、 'library(RColorBrewer)'を追加して上記のコードを再現する必要があります。 – alistaire

+1

geom_point(shape = 20、size = 3、aes)は、素早く、汚れている、つまり下層のグリッド構造に触れることなく、 'p < - ggplot(maya、aes(x = val.a、y = val.b))+ (color = val.e))+ facet_grid(val.c〜val.d)+ xlab(NULL)+ ylab(NULL)+ scale_colour_gradientn(colors = brewer.pal(9、 "YlGnBu")、name = "Splinter")+ テーマ(legend.position = "bottom") '、次に' gridExtra :: grid.arrange(p、top = "Michaelangelo"、right = "Leonardo") 'となります。 – lukeA

+0

残念ながら、どちらも私が望んでいるものではありませんが、これらの2つの答えは非常に有用です。 –

答えて

7

これはかなり一般的です。上部及び右側のストリップの現在の位置は、レイアウトデータフレームで与えられる。このソリューションは、これらの場所を使用して新しいストリップを配置します。新しいストリップは、高さ、幅、背景色、およびフォントのサイズと色が現在のストリップと同じになるように構成されています。以下にいくつかの説明があります。

# Packages 
library(ggplot2) 
library(RColorBrewer) 
library(grid) 
library(gtable) 

# Data 
val.a <- rnorm(20) 
val.b <- rnorm(20) 
val.c <- c("A","B","C","D","E","F","G","H","I","J") 
val.d <- c("A","B","C","D","E","F","G","H","I","J") 
val.e <- rnorm(20) 
maya <- data.frame(val.a,val.b,val.c,val.d,val.e) 

# Base plot 
p <- ggplot(maya, aes(x = val.a, y = val.b)) + 
    geom_point(shape = 20,size = 3, aes(colour = val.e)) + 
    facet_grid(val.c ~ val.d) + 
    xlab("Leonardo") + ylab("Michaelangelo") + 
    scale_colour_gradientn(colours = brewer.pal(9,"YlGnBu"), name = "Splinter") 

# Labels 
labelR = "Variable 1" 
labelT = "Varibale 2" 

# Get the ggplot grob 
z <- ggplotGrob(p) 

# Get the positions of the strips in the gtable: t = top, l = left, ... 
posR <- subset(z$layout, grepl("strip-r", name), select = t:r) 
posT <- subset(z$layout, grepl("strip-t", name), select = t:r) 

# Add a new column to the right of current right strips, 
# and a new row on top of current top strips 
width <- z$widths[max(posR$r)] # width of current right strips 
height <- z$heights[min(posT$t)] # height of current top strips 

z <- gtable_add_cols(z, width, max(posR$r)) 
z <- gtable_add_rows(z, height, min(posT$t)-1) 

# Construct the new strip grobs 
stripR <- gTree(name = "Strip_right", children = gList(
    rectGrob(gp = gpar(col = NA, fill = "grey85")), 
    textGrob(labelR, rot = -90, gp = gpar(fontsize = 8.8, col = "grey10")))) 

stripT <- gTree(name = "Strip_top", children = gList(
    rectGrob(gp = gpar(col = NA, fill = "grey85")), 
    textGrob(labelT, gp = gpar(fontsize = 8.8, col = "grey10")))) 

# Position the grobs in the gtable 
z <- gtable_add_grob(z, stripR, t = min(posR$t)+1, l = max(posR$r) + 1, b = max(posR$b)+1, name = "strip-right") 
z <- gtable_add_grob(z, stripT, t = min(posT$t), l = min(posT$l), r = max(posT$r), name = "strip-top") 

# Add small gaps between strips 
z <- gtable_add_cols(z, unit(1/5, "line"), max(posR$r)) 
z <- gtable_add_rows(z, unit(1/5, "line"), min(posT$t)) 

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

enter image description here

+1

あなたは紳士ですと学者。 –

関連する問題