superponer - Trazar múltiples boxplot en un gráfico
varias graficas en r (5)
Como no mencionas un paquete de trama, 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")
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 here . Dibujé algo a mano para explicar el problema (ver más abajo).
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))
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")
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
Edición 3: ¿Cómo alinear los puntos de geom_point()
con el centro de la trama 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
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")
Esto coloca dos conjuntos de diagramas 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
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 diagrama 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
ggplot versión de la trama 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)
Trama: