¿Hay alguna forma de crear diagramas de dispersión con histogramas marginales como en el ejemplo de abajo ggplot2
? En Matlab es la scatterhist()
función y existen equivalentes para R también. Sin embargo, no lo he visto para ggplot2.
Comencé un intento creando gráficos únicos, pero no sé cómo organizarlos correctamente.
require(ggplot2)
x<-rnorm(300)
y<-rt(300,df=2)
xy<-data.frame(x,y)
xhist <- qplot(x, geom="histogram") + scale_x_continuous(limits=c(min(x),max(x))) + opts(axis.text.x = theme_blank(), axis.title.x=theme_blank(), axis.ticks = theme_blank(), aspect.ratio = 5/16, axis.text.y = theme_blank(), axis.title.y=theme_blank(), background.colour="white")
yhist <- qplot(y, geom="histogram") + coord_flip() + opts(background.fill = "white", background.color ="black")
yhist <- yhist + scale_x_continuous(limits=c(min(x),max(x))) + opts(axis.text.x = theme_blank(), axis.title.x=theme_blank(), axis.ticks = theme_blank(), aspect.ratio = 16/5, axis.text.y = theme_blank(), axis.title.y=theme_blank() )
scatter <- qplot(x,y, data=xy) + scale_x_continuous(limits=c(min(x),max(x))) + scale_y_continuous(limits=c(min(y),max(y)))
none <- qplot(x,y, data=xy) + geom_blank()
y organizarlos con la función publicada aquí . Pero para resumir: ¿hay alguna forma de crear estos gráficos?
Respuestas:
El
gridExtra
paquete debería funcionar aquí. Comience por hacer cada uno de los objetos ggplot:Luego use la función grid.arrange:
fuente
xy <- data.frame(x=rnorm(300), y=rt(300,df=2) )
y usarlodata=xy
en las llamadas a ggplot.Esta no es una respuesta completamente receptiva, pero es muy simple. Ilustra un método alternativo para mostrar densidades marginales y también cómo usar los niveles alfa para la salida gráfica que admite la transparencia:
fuente
Esto puede ser un poco tarde, pero decidí hacer un paquete (
ggExtra
) para esto, ya que implicaba un poco de código y puede ser tedioso escribirlo. El paquete también trata de abordar algunos problemas comunes, como garantizar que incluso si hay un título o el texto se amplía, las tramas seguirán alineadas entre sí.La idea básica es similar a la que dieron las respuestas aquí, pero va un poco más allá de eso. Aquí hay un ejemplo de cómo agregar histogramas marginales a un conjunto aleatorio de 1000 puntos. Esperemos que esto facilite agregar histogramas / gráficos de densidad en el futuro.
Enlace al paquete ggExtra
fuente
Una adición, solo para ahorrar tiempo de búsqueda para las personas que hacen esto después de nosotros.
Las leyendas, las etiquetas de los ejes, los textos de los ejes, los ticks hacen que las tramas se alejen unas de otras, por lo que su trama se verá fea e inconsistente.
Puede corregir esto utilizando algunas de estas configuraciones de tema,
y alinear escalas,
para que los resultados se vean bien:
fuente
Solo una variación muy pequeña en la respuesta de BondedDust , en el espíritu general de los indicadores marginales de distribución.
Edward Tufte ha llamado a este uso de parcelas de alfombra un 'diagrama de trazos de puntos', y tiene un ejemplo en VDQI de usar las líneas de eje para indicar el rango de cada variable. En mi ejemplo, las etiquetas del eje y las líneas de la cuadrícula también indican la distribución de los datos. Las etiquetas se encuentran en los valores del resumen de cinco números de Tukey (mínimo, bisagra inferior, mediana, bisagra superior, máximo), lo que da una impresión rápida de la extensión de cada variable.
Estos cinco números son, por lo tanto, una representación numérica de un diagrama de caja. Es un poco complicado porque las líneas de cuadrícula desigualmente espaciadas sugieren que los ejes tienen una escala no lineal (en este ejemplo son lineales). Quizás sería mejor omitir líneas de cuadrícula u obligarlas a estar en ubicaciones regulares, y simplemente dejar que las etiquetas muestren el resumen de cinco números.
fuente
Como no había una solución satisfactoria para este tipo de trama al comparar diferentes grupos, escribí una función para hacer esto.
Funciona para datos agrupados y no agrupados y acepta parámetros gráficos adicionales:
fuente
He encontrado el paquete (
ggpubr
) que parece funcionar muy bien para este problema y considera varias posibilidades para mostrar los datos.El enlace al paquete está aquí , y en este enlace encontrará un buen tutorial para usarlo. Para completar, adjunto uno de los ejemplos que reproduje.
Primero instalé el paquete (se requiere
devtools
)Para el ejemplo particular de mostrar diferentes histogramas para diferentes grupos, menciona en relación con
ggExtra
: "Una limitación deggExtra
es que no puede hacer frente a múltiples grupos en el diagrama de dispersión y los diagramas marginales. En el código R a continuación, proporcionamos un solución usando elcowplot
paquete ". En mi caso, tuve que instalar el último paquete:Y seguí este fragmento de código:
Lo que funcionó bien para mí:
Iris establece un diagrama de dispersión de histogramas marginales
fuente
shape = 19
enggscatter
. Códigos para formas aquíPuede crear fácilmente diagramas de dispersión atractivos con histogramas marginales utilizando ggstatsplot (también se ajustará y describirá un modelo):
O un poco más atractivo (por defecto) ggpubr :
ACTUALIZAR:
Según lo sugerido por @aickley, utilicé la versión de desarrollo para crear la trama.
fuente
Esta es una vieja pregunta, pero pensé que sería útil publicar una actualización aquí ya que me he encontrado con este mismo problema recientemente (¡gracias a Stefanie Mueller por la ayuda!).
La respuesta más votada usando gridExtra funciona, pero alinear ejes es difícil / hacky, como se ha señalado en los comentarios. Esto ahora se puede resolver usando el comando ggMarginal del paquete ggExtra, como tal:
fuente
Probé esas opciones, pero no estaba satisfecho con los resultados o el código desordenado que uno necesitaría usar para llegar allí. Por suerte, Thomas Lin Pedersen acaba de desarrollar un paquete llamado patchwork , que hace el trabajo de una manera bastante elegante.
Si desea crear un diagrama de dispersión con histogramas marginales, primero deberá crear esos tres gráficos por separado.
Lo único que queda por hacer es agregar esas parcelas con un simple
+
y especificar el diseño con la funciónplot_layout()
.La función
plot_spacer()
agrega un diagrama vacío a la esquina superior derecha. Todos los otros argumentos deben explicarse por sí mismos.Dado que los histogramas dependen en gran medida del ancho de bin elegido, uno podría argumentar que prefiere gráficos de densidad. Con algunas pequeñas modificaciones, se obtendría, por ejemplo, para los datos de seguimiento ocular, una hermosa trama.
Aunque los datos no se proporcionan en este momento, los principios subyacentes deben ser claros.
fuente
Para construir sobre la respuesta de @ alf-pascu, configurar cada parcela manualmente y organizarlas con
cowplot
mucha flexibilidad le otorga mucha flexibilidad a las parcelas principales y marginales (en comparación con algunas de las otras soluciones). Las distribuciones por grupos son un ejemplo. Cambiar la trama principal a una trama de densidad 2D es otra.Lo siguiente crea un diagrama de dispersión con histogramas marginales (correctamente alineados).
Para trazar una trama de densidad 2D, simplemente cambie la trama principal.
fuente
Otra solución usando
ggpubr
ycowplot
, pero aquí creamos trazados usandocowplot::axis_canvas
y los agregamos al diagrama original concowplot::insert_xaxis_grob
:fuente
Hoy en día, hay al menos un paquete CRAN que hace el diagrama de dispersión con sus histogramas marginales.
fuente
Puede utilizar la forma interactiva
ggExtra::ggMarginalGadget(yourplot)
y elegir entre diagramas de caja, diagramas de violín, diagramas de densidad e histogramas con facilidad.como eso
fuente