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!