Trazar múltiples boxplot en un gráfico

Guardé mis datos como un archivo .csv con 12 columnas. Las columnas del 2 al 11 (etiquetadas F1, F2, ..., F11 ) son features . Column one contiene la label de estas características, ya sea good o bad .

Me gustaría trazar una boxplot de boxplot de todas estas 11 características contra la label , pero separadas por good o bad . Mi código hasta ahora es:

 qplot(Label, F1, data=testData, geom = "boxplot", fill=Label, binwidth=0.5, main="Test") + xlab("Label") + ylab("Features") 

Sin embargo, esto solo muestra F1 contra la label .

Mi pregunta es: ¿Cómo mostrar F2, F3, ..., F11 contra la label en un gráfico con alguna dodge position ? He normalizado las características para que estén en la misma escala dentro del rango [0 1].

Los datos de prueba se pueden encontrar aquí . Dibujé algo a mano para explicar el problema (ver más abajo).

ejemplo de diagrama de caja dibujado a mano

Debería obtener sus datos en un formato específico mediante la fusión de sus datos (ver a continuación cómo se parecen los datos fundidos) antes de trazar. De lo contrario, lo que has hecho parece estar bien.

 require(reshape2) df <- read.csv("TestData.csv", header=T) # melting by "Label". `melt is from the reshape2 package. # do ?melt to see what other things it can do (you will surely need it) df.m <- melt(df, id.var = "Label") > df.m # pasting some rows of the melted data.frame # Label variable value # 1 Good F1 0.64778924 # 2 Good F1 0.54608791 # 3 Good F1 0.46134200 # 4 Good F1 0.79421221 # 5 Good F1 0.56919951 # 6 Good F1 0.73568570 # 7 Good F1 0.65094207 # 8 Good F1 0.45749702 # 9 Good F1 0.80861929 # 10 Good F1 0.67310067 # 11 Good F1 0.68781739 # 12 Good F1 0.47009455 # 13 Good F1 0.95859182 # 14 Good F1 1.00000000 # 15 Good F1 0.46908343 # 16 Bad F1 0.57875528 # 17 Bad F1 0.28938046 # 18 Bad F1 0.68511766 require(ggplot2) ggplot(data = df.m, aes(x=variable, y=value)) + geom_boxplot(aes(fill=Label)) 

boxplot_ggplot2

Editar: me doy cuenta de que es posible que necesites facetar. Aquí hay una implementación de eso también:

 p <- ggplot(data = df.m, aes(x=variable, y=value)) + geom_boxplot(aes(fill=Label)) p + facet_wrap( ~ variable, scales="free") 

ggplot2_faceted

Edición 2: ¿Cómo agregar x-labels y-labels , title , cambiar legend heading , agregar una jitter ?

 p <- ggplot(data = df.m, aes(x=variable, y=value)) p <- p + geom_boxplot(aes(fill=Label)) p <- p + geom_jitter() p <- p + facet_wrap( ~ variable, scales="free") p <- p + xlab("x-axis") + ylab("y-axis") + ggtitle("Title") p <- p + guides(fill=guide_legend(title="Legend_Title")) p 

ggplot2_geom_plot

Edición 3: ¿Cómo alinear los puntos de geom_point() con el centro de la ttwig de la casilla? Se podría hacer usando position_dodge . Esto debería funcionar.

 require(ggplot2) p <- ggplot(data = df.m, aes(x=variable, y=value)) p <- p + geom_boxplot(aes(fill = Label)) # if you want color for points replace group with colour=Label p <- p + geom_point(aes(y=value, group=Label), position = position_dodge(width=0.75)) p <- p + facet_wrap( ~ variable, scales="free") p <- p + xlab("x-axis") + ylab("y-axis") + ggtitle("Title") p <- p + guides(fill=guide_legend(title="Legend_Title")) p 

ggplot2_position_dodge_geom_point

Como no mencionas un paquete de ttwig, propongo aquí usar la versión de Lattice (creo que hay más respuestas de ggplot2 que de celosía, al menos desde que estoy aquí en SO).

  ## reshaping the data( similar to the other answer) library(reshape2) dat.m <- melt(TestData,id.vars='Label') library(lattice) bwplot(value~Label |variable, ## see the powerful conditional formula data=dat.m, between=list(y=1), main="Bad or Good") 

enter image description here

ggplot versión de la ttwig de celosía:

 library(reshape2) library(ggplot2) df <- read.csv("TestData.csv", header=T) df.m <- melt(df, id.var = "Label") ggplot(data = df.m, aes(x=Label, y=value)) + geom_boxplot() + facet_wrap(~variable,ncol = 4) 

Ttwig: enter image description here

Usando gráficas base, podemos usar at = para controlar la posición de la caja, combinada con boxwex = para el ancho de las cajas. La primera instrucción de boxplot crea un diagtwig en blanco. Luego agregue los 2 rastros en las siguientes dos declaraciones.

Tenga en cuenta que a continuación, usamos df[,-1] para excluir la primera columna (id) de los valores a trazar. Con marcos de datos diferentes, puede ser necesario cambiar esto a subconjunto para cualquiera de las columnas que contengan los datos que desea trazar.

 df <- data.frame(id = c(rep("Good",200), rep("Bad", 200)), F1 = c(rnorm(200,10,2), rnorm(200,8,1)), F2 = c(rnorm(200,7,1), rnorm(200,6,1)), F3 = c(rnorm(200,6,2), rnorm(200,9,3)), F4 = c(rnorm(200,12,3), rnorm(200,8,2))) boxplot(df[,-1], xlim = c(0.5, ncol(df[,-1])+0.5), boxfill=rgb(1, 1, 1, alpha=1), border=rgb(1, 1, 1, alpha=1)) #invisible boxes boxplot(df[which(df$id=="Good"), -1], xaxt = "n", add = TRUE, boxfill="red", boxwex=0.25, at = 1:ncol(df[,-1]) - 0.15) #shift these left by -0.15 boxplot(df[which(df$id=="Bad"), -1], xaxt = "n", add = TRUE, boxfill="blue", boxwex=0.25, at = 1:ncol(df[,-1]) + 0.15) #shift these right by +0.15 

enter image description here

Sé que esta es una pregunta un poco más antigua, pero es una que también tuve, y si bien las respuestas aceptadas funcionan, hay una manera de hacer algo similar sin usar paquetes adicionales como ggplot o celosía. No es tan agradable porque las diagráficas de caja se superponen en lugar de mostrarse una al lado de la otra, pero:

 boxplot(data1[,1:4]) boxplot(data2[,1:4],add=TRUE,border="red") 

imagen de lo que hace esto.

Esto coloca dos conjuntos de diagtwigs de caja, el segundo tiene un contorno (sin relleno) en rojo y también pone los valores atípicos en rojo. Lo bueno es que funciona para dos marcos de datos diferentes en lugar de tratar de remodelarlos. Manera rápida y sucia