R语言 为合并的ggplot2图添加共同图例
在这篇文章中,我们将讨论如何在R语言中使用ggplot2包创建一个带有共享图例的组合图。
为了连接多个ggplot2图,我们使用R语言中gridExtra包的 grid.arrange() 函数。grid.arrange()函数将框架转换为所需行数和列数的网格。然后,我们把不同的图放在网格的不同部分,为同一框架中的多个图创造所需的外观。
语法
grid.arrange( plot1, plot2,……, ncol/nrow)
其中。
- ncol: 决定了网格中的列数。
- nrow: 决定了网格中的行数。
例子
这里,是一个使用ggplot2包的grid.arrange()函数制作的组合图。
# Load ggplot2 and gridExtra
library("ggplot2")
library("gridExtra")
# Create sample data
set.seed(5642)
sample_data <- data.frame(
name = c("Geek1","Geek2","Geek3",
"Geek4","Geeek5") ,
value=c(31,12,15,28,45))
# Create both plot and store in variable
plot1<-ggplot(sample_data,
aes(x = name, y = value, col=name)) +
geom_point(size=4)
plot2<-ggplot(sample_data,
aes(x = name, y = value, fill=name)) +
geom_col()
# combine both plots using grid.arrange()
grid.arrange(plot1, plot2, ncol = 2)
输出
带有共享图例的组合 图
为了创建一个具有共享图例的组合图,我们遵循以下步骤。
第1步: 使用grid.arrange()函数创建一个没有任何图例的组合图。
# To remove legend
plot+ theme( legend.position = "none" )
# arrange side by side in a grid
grid.arrange( plot1 , plot2 , ncol=2)
第2步: 创建一个函数,从ggplot2图中提取图例并作为ggplot元素返回。
get_only_legend <- function(plot) {
# get tabular interpretation of plot
plot_table <- ggplot_gtable(ggplot_build(plot))
# Mark only legend in plot
legend_plot <- which(sapply(plot_tablegrobs, function(x) xname) == "guide-box")
# extract legend
legend <- plot_table$grobs[[legend_plot]]
# return legend
return(legend)
}
第3步: 用grid.arrange()函数将上述函数得到的图例结合起来。
grid.arrange(combined_plot, legend, nrow = 2, heights = c(10, 1))
而产生的图将是一个带有共享图例的组合图。
例子
这里,是一个使用grid.arrange()函数绘制的带有共享图例的组合图。
# Create sample data
set.seed(5642)
sample_data <- data.frame(
name = c("Geek1","Geek2","Geek3",
"Geek4","Geeek5") ,
value=c(31,12,15,28,45))
# Load ggplot2 and gridExtra
library("ggplot2")
library("gridExtra")
# Create both plot and store in variable without legend
plot1<-ggplot(sample_data,
aes(x = name, y = value, col=name)) +
geom_point(size=4)+
theme(legend.position = "none")
plot2<-ggplot(sample_data,
aes(x = name, y = value, fill=name)) +
geom_col()+
theme(legend.position = "none")
# combine both plots using grid.arrange()
combined_plot <- grid.arrange(plot1, plot2, ncol = 2)
# plot1 with legend
plot1_legend <- ggplot(sample_data,
aes(x = name, y = value, col=name)) +
geom_point(size=4)+
theme(legend.position = "bottom")
# function to extract legend from plot
get_only_legend <- function(plot) {
plot_table <- ggplot_gtable(ggplot_build(plot))
legend_plot <- which(sapply(plot_tablegrobs, function(x) xname) == "guide-box")
legend <- plot_table$grobs[[legend_plot]]
return(legend)
}
# extract legend from plot1 using above function
legend <- get_only_legend(plot1_legend)
# final combined plot with shared legend
grid.arrange(combined_plot, legend, nrow = 2, heights = c(10, 1))
输出