varias superponer lineas histograma graficos grafico graficas ggplot dispersion diagrama barras r ggplot2 histogram scatter-plot

superponer - Diagrama de dispersión con histogramas marginales en ggplot2



superponer graficas en r ggplot (7)

¿Hay alguna manera de crear diagramas de dispersión con histogramas marginales como en el ejemplo siguiente en ggplot2 ? En Matlab es la función scatterhist() y existen equivalentes para R también. Sin embargo, no lo he visto para ggplot2.

Inicié un intento creando gráficos individuales 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 here . Pero para resumir, ¿hay alguna manera de crear estos gráficos?


Como no había una solución satisfactoria para este tipo de trama al comparar diferentes grupos, escribí una function para hacer esto.

Funciona para datos agrupados y desagrupados y acepta parámetros gráficos adicionales:

marginal_plot(x = iris$Sepal.Width, y = iris$Sepal.Length)

marginal_plot(x = Sepal.Width, y = Sepal.Length, group = Species, data = iris, bw = "nrd", lm_formula = NULL, xlab = "Sepal width", ylab = "Sepal length", pch = 15, cex = 0.5)


El paquete gridExtra debería funcionar aquí. Comience por hacer cada uno de los objetos ggplot:

hist_top <- ggplot()+geom_histogram(aes(rnorm(100))) empty <- ggplot()+geom_point(aes(1,1), colour="white")+ theme(axis.ticks=element_blank(), panel.background=element_blank(), axis.text.x=element_blank(), axis.text.y=element_blank(), axis.title.x=element_blank(), axis.title.y=element_blank()) scatter <- ggplot()+geom_point(aes(rnorm(100), rnorm(100))) hist_right <- ggplot()+geom_histogram(aes(rnorm(100)))+coord_flip()

Luego usa la función grid.arrange:

grid.arrange(hist_top, empty, scatter, hist_right, ncol=2, nrow=2, widths=c(4, 1), heights=c(1, 4))


Encontré el paquete ( ggpubr ) que parece funcionar muy bien para este problema y considera varias posibilidades para mostrar los datos.

El enlace al paquete está here , y en este enlace encontrarás un buen tutorial para usarlo. Para completar, adjunto uno de los ejemplos que reproduje.

Primero instalé el paquete (requiere devtools )

if(!require(devtools)) install.packages("devtools") devtools::install_github("kassambara/ggpubr")

Para el ejemplo particular de mostrar diferentes histogramas para diferentes grupos, se menciona en relación con ggExtra : "Una limitación de ggExtra es que no puede hacer frente a múltiples grupos en el diagrama de dispersión y los gráficos marginales. En el código R a continuación, proporcionar una solución usando el paquete cowplot ". En mi caso, tuve que instalar el último paquete:

install.packages("cowplot")

Y seguí este fragmento de código:

# Scatter plot colored by groups ("Species") sp <- ggscatter(iris, x = "Sepal.Length", y = "Sepal.Width", color = "Species", palette = "jco", size = 3, alpha = 0.6)+ border() # Marginal density plot of x (top panel) and y (right panel) xplot <- ggdensity(iris, "Sepal.Length", fill = "Species", palette = "jco") yplot <- ggdensity(iris, "Sepal.Width", fill = "Species", palette = "jco")+ rotate() # Cleaning the plots sp <- sp + rremove("legend") yplot <- yplot + clean_theme() + rremove("legend") xplot <- xplot + clean_theme() + rremove("legend") # Arranging the plot using cowplot library(cowplot) plot_grid(xplot, NULL, sp, yplot, ncol = 2, align = "hv", rel_widths = c(2, 1), rel_heights = c(1, 2))

Lo cual funcionó bien para mí:

Iris establece un diagrama de dispersión de histogramas marginales


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 niveles alfa para resultados gráficos que admiten transparencia:

scatter <- qplot(x,y, data=xy) + scale_x_continuous(limits=c(min(x),max(x))) + scale_y_continuous(limits=c(min(y),max(y))) + geom_rug(col=rgb(.5,0,0,alpha=.2)) scatter


Esto podría ser un poco tarde, pero decidí hacer un paquete ( ggExtra ) para esto ya que involucraba un poco de código y puede ser tedioso escribir. El paquete también trata de abordar un problema común, como garantizar que, incluso si hay un título o se amplía el texto, las tramas seguirán alineándose entre sí.

La idea básica es similar a lo que dieron las respuestas aquí, pero va un poco más allá. Aquí hay un ejemplo de cómo agregar histogramas marginales a un conjunto aleatorio de 1000 puntos. Es de esperar que esto facilite agregar gráficos de histogramas / densidad en el futuro.

Enlace al paquete ggExtra

library(ggplot2) df <- data.frame(x = rnorm(1000, 50, 10), y = rnorm(1000, 50, 10)) p <- ggplot(df, aes(x, y)) + geom_point() + theme_classic() ggExtra::ggMarginal(p, type = "histogram")


Solo una pequeña variación 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 alfombras una "trama de punto a punto", y tiene un ejemplo en VDQI de usar las líneas de los ejes para indicar el rango de cada variable. En mi ejemplo, las etiquetas de ejes y las líneas de cuadrícula también indican la distribución de los datos. Las etiquetas están ubicadas en los valores del resumen de cinco números de Tukey (mínimo, bisagra inferior, mediana, bisagra superior, máximo), dando una impresión rápida de la dispersió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 cuadriculadas desigualmente espaciadas sugieren que los ejes tienen una escala no lineal (en este ejemplo son lineales). Tal vez sería mejor omitir las líneas de cuadrícula o forzarlas a estar en ubicaciones regulares, y simplemente dejar que las etiquetas muestren el resumen de cinco números.

x<-rnorm(300) y<-rt(300,df=10) xy<-data.frame(x,y) require(ggplot2); require(grid) # make the basic plot object ggplot(xy, aes(x, y)) + # set the locations of the x-axis labels as Tukey''s five numbers scale_x_continuous(limit=c(min(x), max(x)), breaks=round(fivenum(x),1)) + # ditto for y-axis labels scale_y_continuous(limit=c(min(y), max(y)), breaks=round(fivenum(y),1)) + # specify points geom_point() + # specify that we want the rug plot geom_rug(size=0.1) + # improve the data/ink ratio theme_set(theme_minimal(base_size = 18))


Una adición, solo para ahorrar algo de 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 y las marcas hacen que las tramas se alejen unas de otras, por lo que su trama se verá fea e inconsistente.

Puede corregir esto usando algunas de estas configuraciones de tema,

+theme(legend.position = "none", axis.title.x = element_blank(), axis.title.y = element_blank(), axis.text.x = element_blank(), axis.text.y = element_blank(), plot.margin = unit(c(3,-5.5,4,3), "mm"))

y alinear escalas,

+scale_x_continuous(breaks = 0:6, limits = c(0,6), expand = c(.05,.05))

para que los resultados se vean bien: