Agregue una leyenda común a las parcelas ggplot2 combinadas en R

En este artículo, discutiremos cómo crear un gráfico combinado con una leyenda compartida en R Language usando el paquete ggplot2.

Para unir varias parcelas ggplot2, usamos la función grid.arrange() del paquete gridExtra en el lenguaje R. La función grid.arrange() convierte el marco en una cuadrícula del número deseado de filas y columnas. Luego colocamos diferentes parcelas en diferentes partes de la cuadrícula para crear el aspecto deseado para varias parcelas en el mismo marco.

Sintaxis:

grid.arrange( plot1, plot2,……, ncol/nrow)

dónde,

  1. ncol: determina el número de columnas en la cuadrícula.
  2. nrow: determina el número de filas en la cuadrícula.

Ejemplo:

Aquí hay un diagrama combinado hecho usando la función grid.arrange() del paquete ggplot2.

R

# 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)

Producción:

Trama combinada con leyenda compartida

Para crear una trama combinada con leyenda compartida seguimos los siguientes pasos:

Paso 1: Cree una trama combinada usando la función grid.arrange() sin ninguna leyenda.

R

# To remove legend
plot+ theme( legend.position = "none" ) 
  
# arrange side by side in a grid
grid.arrange( plot1 , plot2 , ncol=2)

Paso 2: Cree una función que extraiga la leyenda del gráfico ggplot2 y la devuelva como un elemento ggplot.

R

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_table$grobs, function(x) x$name) == "guide-box") 
                              
# extract legend
legend <- plot_table$grobs[[legend_plot]]
                              
# return legend
return(legend) 
}

Paso 3: Combine la leyenda obtenida de la función anterior usando la función grid.arrange().

R

grid.arrange(combined_plot, legend, nrow = 2, heights = c(10, 1))

Y la trama resultante será una trama combinada con una leyenda compartida.

Ejemplo:

Aquí, hay una trama combinada hecha usando la función grid.arrange() con leyenda compartida.

R

# 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_table$grobs, function(x) x$name) == "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))

Producción:

Publicación traducida automáticamente

Artículo escrito por mishrapriyank17 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *