Me gustaría colocar dos parcelas lado a lado usando el paquete ggplot2 , es decir, hacer el equivalente de par(mfrow=c(1,2))
.
Por ejemplo, me gustaría que las siguientes dos gráficas se muestren juntas con la misma escala.
x <- rnorm(100)
eps <- rnorm(100,0,.2)
qplot(x,3*x+eps)
qplot(x,2*x+eps)
¿Tengo que ponerlos en el mismo marco de datos?
qplot(displ, hwy, data=mpg, facets = . ~ year) + geom_smooth()
r
visualization
ggplot2
Christopher DuBois
fuente
fuente
Respuestas:
Cualquier ggplots de lado a lado (o n plot en una cuadrícula)
La función
grid.arrange()
en elgridExtra
paquete combinará múltiples parcelas; así es como pones dos lado a lado.Esto es útil cuando las dos parcelas no se basan en los mismos datos, por ejemplo, si desea trazar diferentes variables sin usar reshape ().
Esto trazará la salida como un efecto secundario. Para imprimir el efecto secundario en un archivo, especifique un controlador de dispositivo (como
pdf
,png
, etc.), por ejemplo,o, usar
arrangeGrob()
en combinación conggsave()
,Esto es el equivalente a hacer dos trazados distintos usando
par(mfrow = c(1,2))
. Esto no solo ahorra tiempo en la organización de los datos, sino que es necesario cuando se desean dos trazados diferentes.Apéndice: uso de facetas
Las facetas son útiles para hacer tramas similares para diferentes grupos. Esto se señala a continuación en muchas respuestas a continuación, pero quiero resaltar este enfoque con ejemplos equivalentes a los gráficos anteriores.
Actualizar
La
plot_grid
función en elcowplot
vale la pena echarle un vistazo como una alternativa agrid.arrange
. Vea la respuesta de @ claus-wilke a continuación y esta viñeta para un enfoque equivalente; pero la función permite controles más precisos sobre la ubicación y el tamaño de la trama, según esta viñeta .fuente
?grid.arrange
me hace pensar que esta función ahora se llama arreglaGrob. Pude hacer lo que quería haciendoa <- arrangeGrob(p1, p2)
y luegoprint(a)
.grid.arrange
sigue siendo una función válida, no en desuso. ¿Intentaste usar la función? Lo que sucede, si no es lo que esperabas.Una desventaja de las soluciones basadas en ellas
grid.arrange
es que dificultan etiquetar las parcelas con letras (A, B, etc.), como lo requieren la mayoría de las revistas.Escribí el paquete cowplot para resolver este (y algunos otros) problemas, específicamente la función
plot_grid()
:El objeto que
plot_grid()
regresa es otro objeto ggplot2, y puede guardarloggsave()
como de costumbre:Alternativamente, puede usar la función de diagrama de trama
save_plot()
, que es una envoltura delgadaggsave()
que facilita obtener las dimensiones correctas para diagramas combinados, por ejemplo:(El
ncol = 2
argumento dicesave_plot()
que hay dos trazados uno al lado del otro ysave_plot()
hace que la imagen guardada sea dos veces más ancha).Para obtener una descripción más detallada de cómo organizar las parcelas en una cuadrícula, vea esta viñeta. También hay una viñeta que explica cómo hacer tramas con una leyenda compartida.
Un punto frecuente de confusión es que el paquete cowplot cambia el tema predeterminado ggplot2. El paquete se comporta de esa manera porque fue escrito originalmente para usos internos de laboratorio, y nunca usamos el tema predeterminado. Si esto causa problemas, puede usar uno de los siguientes tres enfoques para solucionarlos:
1. Establezca el tema manualmente para cada trama. Creo que es una buena práctica especificar siempre un tema en particular para cada argumento, tal como lo hice con
+ theme_bw()
en el ejemplo anterior. Si especifica un tema en particular, el tema predeterminado no importa.2. Revierta el tema predeterminado nuevamente al valor predeterminado de ggplot2. Puede hacer esto con una línea de código:
3. Llame a las funciones de la trama sin adjuntar el paquete. Tampoco puede invocar
library(cowplot)
o,require(cowplot)
y en su lugar, llamar a funciones de diagrama de trama, anteponiendocowplot::
. Por ejemplo, el ejemplo anterior que usa el tema predeterminado ggplot2 sería:Actualizaciones:
fuente
Puede usar la siguiente
multiplot
función del libro de cocina R de Winston Changfuente
Usando el paquete de patchwork , simplemente puede usar el
+
operador:fuente
Sí, creo que necesita organizar sus datos adecuadamente. Una forma sería esta:
Estoy seguro de que hay mejores trucos en plyr o remodelar: todavía no estoy realmente al día con todos estos paquetes poderosos de Hadley.
fuente
Usando el paquete de remodelación puede hacer algo como esto.
fuente
También hay un paquete de múltiples paneles que vale la pena mencionar. Ver también esta respuesta .
Creado el 06/07/2018 por el paquete reprex (v0.2.0.9000).
fuente
ggplot2 se basa en gráficos de cuadrícula, que proporcionan un sistema diferente para organizar trazados en una página. El
par(mfrow...)
comando no tiene un equivalente directo, ya que los objetos de cuadrícula (llamados grobs ) no se dibujan necesariamente de inmediato, sino que pueden almacenarse y manipularse como objetos R normales antes de convertirse en una salida gráfica. Esto permite una mayor flexibilidad que el sorteo ahora. modelo de gráficos base, pero la estrategia es necesariamente un poco diferente.Escribí
grid.arrange()
para proporcionar una interfaz simple lo más cerca posiblepar(mfrow)
. En su forma más simple, el código se vería así:Se detallan más opciones en esta viñeta .
Una queja común es que las parcelas no están necesariamente alineadas, por ejemplo, cuando tienen etiquetas de eje de diferente tamaño, pero esto es por diseño:
grid.arrange
no hace ningún intento de colocar objetos especiales en ggplot2 y los trata por igual a otros grobs (por ejemplo, gráficas de celosía). ) Simplemente coloca grobs en un diseño rectangular.Para el caso especial de los objetos ggplot2, escribí otra función,
ggarrange
con una interfaz similar, que intenta alinear los paneles de trazado (incluidos los trazados facetados) e intenta respetar las relaciones de aspecto cuando el usuario las define.Ambas funciones son compatibles con
ggsave()
. Para obtener una descripción general de las diferentes opciones y un contexto histórico, esta viñeta ofrece información adicional .fuente
Actualización: esta respuesta es muy antigua.
gridExtra::grid.arrange()
ahora es el enfoque recomendado. Dejo esto aquí en caso de que pueda ser útil.Stephen Turner publicó la
arrange()
función en el blog Getting Genetics Done (consulte la publicación para obtener instrucciones sobre la aplicación)fuente
grid.arrange
(desearía no haberla publicado en las listas de correo en ese momento, no hay forma de actualizar estos recursos en línea), la versión empaquetada es una mejor opción si me preguntasUtilizando
tidyverse
:fuente
Las soluciones anteriores pueden no ser eficientes si desea trazar múltiples diagramas de ggplot usando un bucle (por ejemplo, como se pide aquí: Crear múltiples diagramas en ggplot con diferentes valores del eje Y usando un bucle ), que es un paso deseado para analizar lo desconocido ( o grandes) conjuntos de datos (por ejemplo, cuando desea trazar recuentos de todas las variables en un conjunto de datos).
El siguiente código muestra cómo hacerlo utilizando el mencionado 'multiplot ()', cuya fuente está aquí: http://www.cookbook-r.com/Graphs/Multiple_graphs_on_one_page_(ggplot2) :
Ahora ejecute la función: para obtener recuentos de todas las variables impresas usando ggplot en una página
Una cosa a tener en cuenta es que:
usar
aes(get(strX))
, que normalmente usarías en bucles cuando trabajasggplot
, en el código anterior en lugar deaes_string(strX)
NO dibujará los gráficos deseados. En cambio, trazará la última trama muchas veces. No he descubierto por qué, es posible que tenga que hacer elaes
y seaes_string
les llameggplot
.De lo contrario, espero que encuentre útil la función.
fuente
plots
objetos dentro de losfor-loop
cuales es altamente ineficiente y no se recomiendaR
. Consulte estas excelentes publicaciones para descubrir mejores formas de hacerlo: acumulación eficiente en R , aplicación de una función sobre filas de un marco de datos y flujos de trabajo orientados a filas en R con el tidyversetidy evaluation
enfoque que ha estado disponible desdeggplot2 v.3.0.0
stackoverflow.com/a/52045613/786542En mi experiencia, gridExtra: grid.arrange funciona perfectamente, si está tratando de generar trazados en un bucle.
Fragmento de código corto:
fuente
El
cowplot
paquete le brinda una buena manera de hacerlo, de una manera que se adapte a la publicación.fuente