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.