varias lineas histograma graficos grafico graficas dispersion r ggplot2 boxplot

lineas - plot en r



Múltiples gráficos de cajas dentro de un grupo (2)

Encontré algunas soluciones pero no exactamente lo que quiero. Tengo 5 dataframes en R y cada dataframe tiene 4 columnas:

Digamos que el nombre del primer dataframe es "Gene1"

Ind1 Ind2 Ind3 Ind4 1 3 3.2 2.5 1 3 4 2 1.5 2 2.2 1 3.4 2 1 3

y los dataframes restantes se llaman "Gene2", "Gene3", "Gene4", "Gene5" y son similares.

Quiero trazar diagramas de caja uno al lado del otro en el mismo diagrama para todos los marcos de datos y para todas las columnas. No encontré ninguna trama como esta, así que no puedo subir una foto, pero intentaré explicarlo.

Ahora a partir de los datos anteriores, la trama tendrá 20 diagramas de caja. El primer gráfico de 4 casillas debería estar cerca el uno del otro y el nombre del eje x debería ser "Gene1" (para los 4 diagramas de caja) y luego un pequeño espacio en el gráfico y nuevamente 4 diagramas de caja con el nombre de eje x "Gene2" y así sucesivamente .

Puedo trazar fácilmente todos los diagramas de caja en una parcela, pero no puedo distinguir los marcos de datos. Lo que significa que debería mostrarnos claramente que los primeros 4 diagramas de caja son de "Gene1" y los siguientes 4 diagramas de caja son de "Gene2" y así sucesivamente.

Por favor, avíseme si el problema no está claro.


Aquí hay una foto en la oscuridad en lo que quieras, usando ggplot2 y herramientas relacionadas.

library(ggplot2) library(reshape2) library(plyr) Gene1 <- read.table(text = "Ind1 Ind2 Ind3 Ind4 1 3 3.2 2.5 1 3 4 2 1.5 2 2.2 1 3.4 2 1 3", header = TRUE) #Make a copy of Gene1 Gene2 <- Gene1 #A Round about way to rbind these together with an ID column combined_data <- ldply(list(Gene1 = Gene2, Gene2 = Gene2)) #Melt into the long format needed by ggplot2 combined_data_melt <- melt(combined_data, id.vars = 1) #Plot and use facet_wrap for each data.frame ggplot(combined_data_melt, aes(variable, value)) + geom_boxplot() + facet_wrap(~.id, ncol = 1) + theme_bw()

Te da algo así como un resultado:

Esto debería hacer lo que quieras, un cambio bastante menor en el código. Gracias a Joran por el consejo en el chat de R sobre esquivar.

ggplot(combined_data_melt, aes(.id, value, dodge = variable)) + geom_boxplot(position = position_dodge(width = 0.8)) + theme_bw()


Sospecho que esto es lo que quieres, y de hecho no es muy complicado de hacer con las funciones de trazado en el paquete de graphics estándar. Los grupos se trazan como 4 paneles separados, pero con un eje y compartido y un título trazado en el margen exterior se ve como un único gráfico.

# Faking the data, since you didn''t provide any Gene <- data.frame(matrix(rweibull(100*4, 1), 100)) names(Gene) <- paste0("Ind", 1:4) Gene <- rep(list(Gene), 4) # Setup the panels layout(t(1:4)) par(oma=c(2, 4, 4, 0), mar=rep(1, 4), cex=1) # `mar` controls the space around each boxplot group # Calculating the range so that the panels are comparable my.ylim <- c(min(sapply(Gene, min)), max(sapply(Gene, max))) # Plot all the boxes for(i in 1:length(Gene)){ boxplot(Gene[[i]], ylim=my.ylim, axes=FALSE) mtext(paste("Gene", i), 1, 0) if(i == 1){ axis(2, las=1) mtext("Expression or what you have", 2, 3) } } title("Look at all my genes!", outer=TRUE)

Por cierto, recomiendo almacenar sus marcos de datos en una lista en lugar de imitar una lista llamándolos "Gene1", "Gene2", "Gene3" y "Gene4". Es mucho más fácil automatizar de esa manera. Si aún desea almacenarlos como variables separadas, reemplace Gene[[i]] con get(paste0("Gene", i)) y my.ylim <- ... con min(c(min(Gene1), min(Gene2) ... etc.