添加一个共同的图例

时间:2018-04-13 22:32:40

标签: r ggplot2 gridextra cowplot r-lemon

我试图用ggplot2进行多重绘图。 这是我的初始代码

nucmer_s1 <- ggarrange(eight_uniform, ten_uniform, twelve_uniform, fourteen_uniform, sixteen_uniform, 
                       ncol=3, nrow=2, common.legend = TRUE, legend="bottom") 

收到此错误

  

绘图$ scale中的错误:$ operator对原子矢量无效

然后

annotate_figure(nucmer_s1, 
                top = text_grob("Genomas validados con distribución de datos equilibrada",
                color = "black", face = "bold", size = 12))

然而我获得了图形 enter image description here 但我需要在每个情节中为标题添加一个标题,所以我改为这个标题

nucmer_s1 <-grid.arrange(
  eight_uniform + ggtitle("8 genomas"), 
  ten_uniform +  ggtitle("10 genomas"), 
  twelve_uniform + ggtitle("12 genomas"), 
  fourteen_uniform + ggtitle("14 genomas"), 
  sixteen_uniform + ggtitle("16 genomas"), 
  ncol=3, nrow=2, common.legend = TRUE, legend="bottom")

但我得到了

  

gList中的错误(列表(grobs = list(list(x = 0.5,y = 0.5,width = 1,height = 1,:
)         只有“grobs”允许在“gList”中       Además:警告信息:
      1:在grob $ wrapvp&lt; - vp:Realizando coercion de LHD a una lista
      2:在grob $ wrapvp&lt; - vp:Realizando coercion de LHD a una lista

所以我删除了common.legend部分 得到了这个情节

enter image description here 所以我有两个问题:

  • 有没有办法在不使用facet_grid的情况下用灰色框在每个情节中添加标题(因为我在数据中没有这些信息)?和

  • 有没有办法将图例放在多图的空白处?

非常感谢你的帮助

1 个答案:

答案 0 :(得分:1)

lemoncowplot个包具有非常好的内置函数来处理图之间的共享图例

来自lemon package 的

示例
library(ggplot2)
library(grid)
library(gtable)
library(lemon)

dsamp <- diamonds[sample(nrow(diamonds), 1000), ]
d <- ggplot(dsamp, aes(carat, price)) +
  geom_point(aes(colour = clarity)) +
  theme(legend.position = c(0.06, 0.75))

d3 <- d + 
  facet_wrap(~cut, ncol=3) + 
  scale_color_discrete(guide=guide_legend(ncol=3))

# Use gtable_show_names to display the names of the facetted panels
gtable_show_names(d3)

# So to place the legend in a specific panel, give its name:
reposition_legend(d3, 'center', panel='panel-3-2')

来自cowplot包的

示例

library(cowplot)

# Make three plots.
# We set left and right margins to 0 to remove unnecessary spacing in the
# final plot arrangement.
p1 <- qplot(carat, price, data=dsamp, colour=clarity) +
  theme(plot.margin = unit(c(6,0,6,0), "pt"))

p2 <- qplot(depth, price, data=dsamp, colour=clarity) +
  theme(plot.margin = unit(c(6,0,6,0), "pt")) + ylab("")

p3 <- qplot(color, price, data=dsamp, colour=clarity) +
  theme(plot.margin = unit(c(6,0,6,0), "pt")) + ylab("")

# arrange the three plots in a single row
prow <- plot_grid( p1 + theme(legend.position="none"),
           p2 + theme(legend.position="none"),
           p3 + theme(legend.position="none"),
           align = 'vh',
           labels = c("A", "B", "C"),
           hjust = -1,
           nrow = 1
           )

# extract the legend from one of the plots
# (clearly the whole thing only makes sense if all plots
# have the same legend, so we can arbitrarily pick one.)
legend <- get_legend(p1)

# add the legend to the row we made earlier. Give it one-third of the width
# of one plot (via rel_widths).
p <- plot_grid( prow, legend, rel_widths = c(3, .3))
p

reprex package(v0.2.0)创建于2018-04-14。