2017-09-15 9 views
0

この再現可能なグリッドプロットでは、3つのプロットに3つの塗りつぶし色があり、zは "col"青で表示されますが、4つ目のプロットでは1つの "col"赤。グリッドプロットの一般的な凡例

普通の凡例(私ができること)はのみを表示したいが、4つのプロットすべてで青色にしたい。。それを行う簡単な方法はありますか?

enter image description here

#--------------------- 
# Reproducible example 
#--------------------- 
library(tidyverse) 
library(ggplot2) 
library(grid) 
library(gridExtra) 
d0 <- read_csv("x, y, col\na,2,x\nb,2,y\nc,1,z") 
d1 <- read_csv("x, y, col\na,2,x\nb,2,y\nc,1,z") 
d2 <- read_csv("x, y, col\na,2,x\nb,2,y\nc,1,z") 
d3 <- read_csv("x, y, col\na,2,z\nb,2,z\nc,1,z") 
p0 <- ggplot(d0) + geom_col(mapping = aes(x, y, fill = col)) 
p1 <- ggplot(d1) + geom_col(mapping = aes(x, y, fill = col)) 
p2 <- ggplot(d2) + geom_col(mapping = aes(x, y, fill = col)) 
p3 <- ggplot(d3) + geom_col(mapping = aes(x, y, fill = col)) 
grid.arrange(p0, arrangeGrob(p1,p2,p3, ncol=3), ncol=1) 

答えて

1

これは凡例を抽出するgtable用いてcol因子のレベルを反転を達成することができる。

library(tidyverse) 
library(ggplot2) 
library(grid) 
library(gridExtra) 
library(gtable) 
d0 <- read_csv("x, y, col\na,2,x\nb,2,y\nc,1,z") 
d1 <- read_csv("x, y, col\na,2,x\nb,2,y\nc,1,z") 
d2 <- read_csv("x, y, col\na,2,x\nb,2,y\nc,1,z") 
d3 <- read_csv("x, y, col\na,2,z\nb,2,z\nc,1,z") 

d0 %>% 
    mutate(col = factor(col, levels = c("z", "y", "x"))) %>% 
    ggplot() + geom_col(mapping = aes(x, y, fill = col)) -> p0 

d1 %>% 
    mutate(col = factor(col, levels = c("z", "y", "x"))) %>% 
    ggplot() + geom_col(mapping = aes(x, y, fill = col))+ 
    theme(legend.position="bottom") -> p1 

d2 %>% 
    mutate(col = factor(col, levels = c("z", "y", "x"))) %>% 
    ggplot() + geom_col(mapping = aes(x, y, fill = col)) -> p2 

d3 %>% 
    ggplot() + geom_col(mapping = aes(x, y, fill = col)) -> p3 

legend = gtable_filter(ggplot_gtable(ggplot_build(p1)), "guide-box") 

grid.arrange(p0 + theme(legend.position="none"), 
      arrangeGrob(p1 + theme(legend.position="none"), 
         p2 + theme(legend.position="none"), 
         p3 + theme(legend.position="none"), 
         nrow = 1), 
      legend, 
      heights=c(1.1, 1.1, 0.1), 
      nrow = 3) 

enter image description here

別のアプローチは、すべてでscale_fill_manualを使用することですプロットレベルを変更せずにプロットします。

例:抽出された元のデータや伝説を持つので

p0 + scale_fill_manual(values = c("x" = "red", "z" = "black", "y" = "green")) 

enter image description here

d0 <- read_csv("x, y, col\na,2,x\nb,2,y\nc,1,z") 
d1 <- read_csv("x, y, col\na,2,x\nb,2,y\nc,1,z") 
d2 <- read_csv("x, y, col\na,2,x\nb,2,y\nc,1,z") 
d3 <- read_csv("x, y, col\na,2,z\nb,2,z\nc,1,z") 
p0 <- ggplot(d0) + geom_col(mapping = aes(x, y, fill = col)) 
p1 <- ggplot(d1) + geom_col(mapping = aes(x, y, fill = col)) 
p2 <- ggplot(d2) + geom_col(mapping = aes(x, y, fill = col)) 
p3 <- ggplot(d3) + geom_col(mapping = aes(x, y, fill = col)) 
legend = gtable_filter(ggplot_gtable(ggplot_build(p1 + theme(legend.position="bottom"))), "guide-box") 

grid.arrange(p0 + theme(legend.position="none"), 
      arrangeGrob(p1 + theme(legend.position="none"), 
         p2 + theme(legend.position="none"), 
         p3 + theme(legend.position="none") + 
          scale_fill_manual(values = c("z" = "#619CFF")), 
         nrow = 1), 
      legend, 
      heights=c(1.1, 1.1, 0.1), 
      nrow = 3) 

enter image description here最後に

+0

を与えることになる素晴らしいアイデアをありがとうございました。現時点では、私のコードは例のように3つの凡例値しかないので、私はscale_fill_manualに行ってきました。私はInがもっと時間を持っているときにもう一つのオプションを探るつもりです。 – Carl

1

私ggplot2パッケージが輝くための時間!

https://cran.r-project.org/package=lemon)に組み込まれたgrid_arrange_shared_legendを使用してください。 Working with legendsビネットに例があります。

結果は、このようなことができます: Example from vignette

しかし...それはあなたの例では動作しませんでしたので、私はパッケージを更新しました。あなたはgithubのからのdevel-バージョンをインストールする必要があります:

library(devtools) 
install_github('stefanedwards/lemon', ref='e05337a') 

あなたは以下の

library(lemon) 
# your code to create p0 - p4 
nt <- theme(legend.position='none') 
grid_arrange_shared_legend(p0, arrangeGrob(p1+nt,p2+nt,p3+nt, ncol=3), ncol=1, nrow=2) 

enter image description here

+0

ありがとうございます。このパッケージは興味深く見えます。時間があれば試してみます。私が持っている例の短期的な解決策として、私はscale_fill_manualを使ってきました。 – Carl

関連する問題