Saltar al contenido

Mostrando diferentes etiquetas de eje usando ggplot2 con facet_wrap

Solución:

En ggplot2_2.2.1 puede mover las tiras del panel para que sean las etiquetas del eje y utilizando el strip.position argumento en facet_wrap. Sin embargo, al usar este método, no tiene etiquetas de tira y etiquetas de eje y diferentes, lo que puede no ser ideal.

Una vez que haya colocado las etiquetas de la tira en el eje y (la “izquierda”), puede cambiar las etiquetas dando un vector con nombre a labeller para ser utilizado como tabla de consulta.

Las etiquetas de tira se pueden mover fuera del eje y mediante strip.placement en theme.

Elimine el fondo de la tira y las etiquetas del eje y para obtener un gráfico final con dos paneles y etiquetas distintas del eje y.

ggplot(my.df, aes(x = time, y = value) ) + 
     geom_line( aes(color = variable) ) + 
     facet_wrap(~Unit, scales = "free_y", nrow = 2, 
                strip.position = "left", 
                labeller = as_labeller(c(A = "Currents (A)", V = "Voltage (V)") ) )  +
     ylab(NULL) +
     theme(strip.background = element_blank(),
           strip.placement = "outside")

ingrese la descripción de la imagen aquí


Quitar la tira de la parte superior hace que los dos paneles estén bastante juntos. Para cambiar el espaciado, puede agregar, por ejemplo, panel.margin = unit(1, "lines") para theme.

Aquí hay una solución manual, esta pregunta se puede resolver más rápido y más fácilmente con otros métodos:

trama

Trabajar con márgenes y laboratorios le permitirá pegar el gráfico 2 si realmente lo necesita.

x <- seq(0, 10, by = 0.1)
y1 <- sin(x)
y2 <- sin(x + pi/4)
y3 <- cos(x)

my.df <- data.frame(time = x, currentA = y1, currentB = y2, voltage = y3)
my.df <- melt(my.df, id.vars = "time")
my.df$Unit <- as.factor(rep(c("A", "A", "V"), each = length(x)))


# Create 3 plots :
# A: currentA and currentB plot
A = ggplot(my.df, aes(x = time, y = value, color  = variable, alpha = variable)) + 
geom_line() + ylab("A") + 
scale_alpha_manual(values = c("currentA" = 1, "currentB" = 1, "voltage" = 0)) + 
guides(alpha = F, color = F)
# B: voltage plot
B =  ggplot(my.df, aes(x = time, y = value, color  = variable, alpha = variable)) + 
geom_line() + ylab("A") + 
scale_alpha_manual(values = c("currentA" = 0, "currentB" = 0, "voltage" = 1)) + 
guides(alpha = F, color = F)
# C: get the legend
C = ggplot(my.df, aes(x = time, y = value, color  = variable)) + geom_line() + ylab("A")


library(gridExtra) 
# http://stackoverflow.com/questions/12539348/ggplot-separate-legend-and-plot
# use this trick to get the legend as a grob object
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
}

#extract legend from C plot
legend = g_legend(C)

#arrange grob (the 2 plots)
plots = arrangeGrob(A,B) 

# arrange the plots and the legend
grid.arrange(plots, legend , ncol = 2, widths = c(3/4,1/4))
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags : / /

Utiliza Nuestro Buscador

Deja una respuesta

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