manipulation ggtitle ggplot change r ggplot2

r - ggplot - ggtitle



Creando paneles arbitrarios en ggplot2 (5)

A partir de julio de 2018, hay varios paquetes que ayudan a crear parcelas de múltiples paneles muy bien. Ver ejemplos a continuación

library(ggplot2) theme_set(theme_bw()) q1 <- ggplot(mtcars) + geom_point(aes(mpg, disp)) q2 <- ggplot(mtcars) + geom_boxplot(aes(gear, disp, group = gear)) q3 <- ggplot(mtcars) + geom_smooth(aes(disp, qsec)) q4 <- ggplot(mtcars) + geom_bar(aes(carb))

paquete de huevo

library(grid) library(egg) ggarrange(q1, q2, q3, q4, ncol = 2, top = "Plot title", bottom = textGrob( "This footnote is right-justified", gp = gpar(fontface = 3, fontsize = 10), hjust = 1, x = 1) ) #> `geom_smooth()` using method = ''loess'' and formula ''y ~ x''

paquete de vaivén

library(cowplot) plot_grid(q1, q2, q3, q4, ncol = 2, labels = "AUTO") #> `geom_smooth()` using method = ''loess'' and formula ''y ~ x''

paquete de patchwork

library(patchwork) q1 + q2 + q3 + q4 + plot_layout(ncol = 2) + plot_annotation(title = "Plot title", subtitle = "Plot subtitle", tag_levels = ''A'', tag_suffix = '')'') #> `geom_smooth()` using method = ''loess'' and formula ''y ~ x''

# complex layout 1 q1 + { q2 + plot_spacer() + { q3 + q4 + plot_layout(ncol = 1) } } + plot_layout(ncol = 1) #> `geom_smooth()` using method = ''loess'' and formula ''y ~ x''

# complex layout 2 (q1 | q2 | q3) / q4 #> `geom_smooth()` using method = ''loess'' and formula ''y ~ x''

# bonus: working with grob objects p1 <- ggplot(mtcars) + geom_boxplot(aes(gear, disp, group = gear)) table1 <- tableGrob(mtcars[1:6, 1:4]) patchwork::wrap_plots(list(p1, table1), nrow = 1)

paquete multipanelfigure

library(magrittr) library(multipanelfigure) figure1 <- multi_panel_figure(columns = 2, rows = 2, panel_label_type = "none") # show the layout figure1

figure1 %<>% fill_panel(q1, column = 1, row = 1) %<>% fill_panel(q2, column = 2, row = 1) %<>% fill_panel(q3, column = 1, row = 2) %<>% fill_panel(q4, column = 2, row = 2) #> `geom_smooth()` using method = ''loess'' and formula ''y ~ x'' figure1

# complex layout figure2 <- multi_panel_figure(columns = 3, rows = 3, panel_label_type = "upper-roman") figure2 %<>% fill_panel(q1, column = 1:2, row = 1) %<>% fill_panel(q2, column = 3, row = 1) %<>% fill_panel(q3, column = 1, row = 2) %<>% fill_panel(q4, column = 2:3, row = 2:3) #> `geom_smooth()` using method = ''loess'' and formula ''y ~ x'' figure2

Creado el 2018-07-06 por el paquete reprex (v0.2.0.9000).

En los gráficos base puedo crear un panel de gráficos de 4 paneles haciendo lo siguiente:

par(mfrow=c(2,2)) for (i in 1:4){ plot(density(rnorm(100))) }

lo que resulta en

Me gustaría hacer lo mismo con ggplot2, pero no puedo averiguar cómo hacerlo. No puedo usar facetas porque mis datos reales, a diferencia de este ejemplo trivial, están en estructuras muy diferentes y quiero que dos gráficos sean gráficos de puntos y dos histogramas. ¿Cómo se pueden crear paneles o paneles en ggplot2?


Gracias a los comentarios de Andrie y la respuesta de Harlan a mi pregunta anterior (!), Preparé esta solución que logra lo que estaba buscando:

set.seed(2) q1 <- ggplot(data.frame(x=rnorm(50)), aes(x)) + geom_density() q2 <- ggplot(data.frame(x=rnorm(50)), aes(x)) + geom_density() q3 <- ggplot(data.frame(x=rnorm(50)), aes(x)) + geom_density() q4 <- ggplot(data.frame(x=rnorm(50)), aes(x)) + geom_density() grid.newpage() pushViewport(viewport(layout=grid.layout(2,2))) vplayout <- function(x,y) viewport(layout.pos.row=x,layout.pos.col=y) print(q1,vp=vplayout(1,1)) print(q2,vp=vplayout(1,2)) print(q3,vp=vplayout(2,1)) print(q4,vp=vplayout(2,2))

cuyos rendimientos:


Siguiendo el ejemplo de Josh O''Brien: Me sorprende que nadie haya mencionado grid.arrange del paquete gridExtra todavía:

library(gridExtra) grid.arrange(q1,q2,q3,q4,q5,q6,nrow=3)

Esto parece ser mencionado aquí: múltiples gráficos en un lienzo usando ggplot2

Para mí, es mucho más fácil que recordar todas las cosas de la ventana gráfica.


Una utilidad que creo que merece más atención para esto es wq::layOut (note la capital "O"). Es como base::layout en que las parcelas pueden ser de diferentes tamaños, distribuidas en filas y columnas. Cada argumento de layOut es una lista de 3 elementos que consta de la gráfica, los índices de fila en los que se layOut y los índices de columna en los que se grafican. Por ejemplo:

library("ggplot2") # Generate arbitrary ggplots plot1 <- qplot(data = mtcars, x=wt, y=mpg, geom="point",main="Scatterplot of wt vs. mpg") plot2 <- qplot(data = mtcars, x=wt, y=disp, geom="point",main="Scatterplot of wt vs disp") plot3 <- qplot(wt,data=mtcars) plot4 <- qplot(wt,mpg,data=mtcars,geom="boxplot") plot5 <- qplot(wt,data=mtcars) plot6 <- qplot(mpg,data=mtcars) plot7 <- qplot(disp,data=mtcars) wq::layOut(list(plot1, 1, 1), list(plot2, 1, 2), list(plot3, 2, 1), list(plot4, 2, 2), list(plot5, 3, 1:2), list(plot6, 4, 1:2), list(plot7, 1:2, 3))


EDITAR: {Ben Bolker apunta a una opción aún mejor: grid.arrange del paquete gridExtra . Sin embargo, si usted es un usuario de ggplot2 , el sitio R Cookbook aún vale la pena hacer clic. }

Hay un código para una buena función de multiplot en esta página del R Cookbook (definitivamente vale la pena una visita) que es útil para este tipo de cosas. Cotizando directamente desde ese sitio:

multiplot <- function(..., plotlist=NULL, cols) { require(grid) # Make a list from the ... arguments and plotlist plots <- c(list(...), plotlist) numPlots = length(plots) # Make the panel plotCols = cols # Number of columns of plots plotRows = ceiling(numPlots/plotCols) # Number of rows needed, calculated from # of cols # Set up the page grid.newpage() pushViewport(viewport(layout = grid.layout(plotRows, plotCols))) vplayout <- function(x, y) viewport(layout.pos.row = x, layout.pos.col = y) # Make each plot, in the correct location for (i in 1:numPlots) { curRow = ceiling(i/plotCols) curCol = (i-1) %% plotCols + 1 print(plots[[i]], vp = vplayout(curRow, curCol )) } }

Inténtelo con 6 parcelas en un diseño de 3 por 2 (cuatro parcelas de JD Long y dos bonificaciones):

set.seed(2) q1 <- ggplot(data.frame(x=rnorm(50)), aes(x)) + geom_density() q2 <- ggplot(data.frame(x=rnorm(50)), aes(x)) + geom_density() q3 <- ggplot(data.frame(x=rnorm(50)), aes(x)) + geom_density() q4 <- ggplot(data.frame(x=rnorm(50)), aes(x)) + geom_density() q5 <- ggplot(data.frame(x=rnorm(50)), aes(x)) + geom_density() q6 <- ggplot(data.frame(x=rnorm(50)), aes(x)) + geom_density() multiplot(q1, q2, q3, q4, q5, q6, cols=2)

da esta figura:

Si la función no se ajusta a sus necesidades, ¡al menos le da un buen punto de partida!