ggplot separate legend and plot

这一生的挚爱 提交于 2019-11-26 05:37:51

问题


I am using the grid lpackage to place my graphs that I made with ggplot2:

library(ggplot2)
library(grid)

Layout <- grid.layout(nrow = 4, ncol = 4,
          widths = unit(1, \"null\"), 
          heights = unit(c(0.4, 0.8, 1.2, 1.2), c(\"null\", \"null\", \"null\")))
grid.show.layout(Layout)

plot1 = ggplot(diamonds, aes(clarity, fill = color)) + 
            geom_bar() + 
            facet_wrap(~cut, nrow = 1)
print(plot1 + theme(legend.position = \"none\"), 
vp = viewport(layout.pos.row = 3, layout.pos.col = 1:4))

The problem is that I want to put the plot on the third row (3,1) - (3,4) and put the legend at the (4,4) position. Unfortunately, I can\'t really find a way to create just a legend variable. I searched online and the closest that I got was using the older + opts(keep = \"legend_box\") but that has been deprecated.

older solution.


回答1:


You can get the legend from the grob object of the ggplot. Then you could use the grid.arrange function to position everything.

library(gridExtra)
g_legend<-function(a.gplot){
    tmp <- ggplot_gtable(ggplot_build(a.gplot))
    leg <- which(sapply(tmp$grobs, function(x) x$name) == "guide-box")
    legend <- tmp$grobs[[leg]]
    legend
}

legend <- g_legend(plot1)

grid.arrange(legend, plot1+ theme(legend.position = 'none'), 
    ncol=2, nrow=1, widths=c(1/6,5/6))

There are lots of examples on the web using the g_legend function.

HTH




回答2:


There is an function grid_arrange_shared_legend suggested by the developers of ggplot2 themselves: https://github.com/hadley/ggplot2/wiki/Share-a-legend-between-two-ggplot2-graphs, which works pretty good.



来源:https://stackoverflow.com/questions/12539348/ggplot-separate-legend-and-plot

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!