Etiquetado de diagramas de caja en R

11

Necesito construir un diagrama de caja sin ejes y agregarlo al diagrama actual (curva ROC), pero necesito agregar más información de texto al diagrama de caja: las etiquetas para min y max. La línea de código actual está debajo (gráfico actual también).

Muchas gracias por la ayuda

boxplot(data, horizontal = TRUE, range = 0, axes=FALSE, col = "grey", add = TRUE)

La otra solución es agregar la línea de 0 a 1 (en lugar del eje x), pero quiero que pase por la línea central ... por ejemplo, como este gráfico

ingrese la descripción de la imagen aquí

Vladimir Chupakhin
fuente

Respuestas:

9

Creo que encontrarás que esto produce algo así como tu diagrama dibujado a mano.

data    <- c(0.4, 0.7, 0.75, 0.82, 0.9)
endaxis <- c(0, 1)  # endpoints of axis
datamm  <- c(min(data), max(data))
boxplot(data, horizontal = TRUE, range = 0, ylim = endaxis,
                    axes = FALSE, col = "grey", add = FALSE)
arrows(endaxis, 1,  datamm, 1,  code = 1, angle = 90, length = 0.1)
valuelabels <- c(endaxis[1], round(fivenum(data)[2], digits = 2) ,
                 round(fivenum(data)[4], digits = 2), endaxis[2]  ) 
text(x = valuelabels, y = c(1.05, 1.25, 1.25, 1.05), labels = valuelabels)

R boxplot con etiquetas de valor

Probablemente hay mejores formas de hacerlo. Es posible que deba adaptarlo para que se ajuste a su diagrama ROC, incluido el cambioadd = FALSE

Enrique
fuente
1
Bueno, su respuesta parece más cercana a lo que pidió el OP (por lo que tengo +1). Sin embargo, siento que esto ya no es un diagrama de caja, o al menos pierde su interés en detectar posibles valores periféricos. Cabe destacar que puede personalizar un poco más el diagrama de caja (consulte los parsargumentos para reducir su relación de aspecto ( boxwex) y el tamaño de los bigotes ( staplewex)).
chl
8

Pruebe algo como esto para una versión independiente:

bxp <- boxplot(rnorm(100), horizontal=TRUE, axes=FALSE)
mtext(c("Min","Max"), side=3, at=bxp$stats[c(1,5)], line=-3)

Tenga en cuenta que puede obtener información al llamar boxplot, en particular los "cinco números".

Si desea que se superponga a otro gráfico, use add=Tpero reemplace mtextpor text; necesitará establecer un valor (que depende de la forma en que traza el otro gráfico).y

John Maindonald dio un ejemplo más completo (el código debe estar en su sitio web):

ingrese la descripción de la imagen aquí

chl
fuente
3

Totalmente personalizable ggplot2 boxplot ...

#bootstrap
data <- data.frame(value=rnorm(100,mean = 0.5, sd = 0.2),group=0)
#processing
metaData <- ddply(data,~group,summarise,
            mean=mean(data$value),
			sd=sd(data$value),
            min=min(data$value),
			max=max(data$value),
            median=median(data$value),
			Q1=0,Q3=0
			)
bps <- boxplot.stats(data$value,coef=1.5) 
metaData$min <- bps$stats[1] #lower wisker
metaData$max <- bps$stats[5] #upper wisker
metaData$Q1 <- bps$stats[2] # 1st Quartile
metaData$Q3 <- bps$stats[4] # 3rd Quartile

#adding outliers
out <- data.frame() #initialising storage for outliers
if(length(bps$out) > 0){
	for(n in 1:length(bps$out)){
		pt <-data.frame(value=bps$out[n],group=0) 
		out<-rbind(out,pt) 
	}
}
#adding labels
labels <-data.frame(value=metaData$max, label="Upper bound")
labels <-rbind(labels,data.frame(value=metaData$min, label="Lower bound"))
labels <-rbind(labels,data.frame(value=metaData$median, label="Median"))
labels <-rbind(labels,data.frame(value=metaData$Q1, label="First quartile"))
labels <-rbind(labels,data.frame(value=metaData$Q3, label="Third quartile"))

#drawing
library(ggplot2)
p <- ggplot(metaData,aes(x=group,y=mean))
p <- p + geom_segment(aes(x=c(0.1,0,0.1),y=c(0,0,1),xend=c(0,0,-0.1),yend=c(0,1,1)))
p <- p + geom_text(aes(y=c(0,1),label=c(0,1),x=0.2))
p <- p + geom_errorbar(aes(ymin=min,ymax=max),linetype = 1,width = 0.5) #main range
p <- p + geom_linerange(aes(ymin=min,ymax=max),linetype = 1,width = 0, color="white")# white line range
p <- p + geom_linerange(aes(ymin=min,ymax=max),linetype = 2)    #main range dotted
p <- p + geom_crossbar(aes(y=median,,ymin=Q1,ymax=Q3),linetype = 1,fill='white') #box
if(length(out) >0) p <- p + geom_point(data=out,aes(x=group,y=value),shape=4) # drawning outliers if any
p <- p + scale_x_discrete(breaks=c(0))
p <- p + scale_y_continuous(name= "Value")
p <- p + geom_text(data=labels,aes(x=0.5,y=value,label=round(value,2)),colour="black",angle=0,hjust=0.5, vjust=0.5,size=3)

p <- p + opts(panel.background = theme_rect(fill = "white",colour = NA)) 
p <- p + opts(panel.grid.minor = theme_blank(), panel.grid.major = theme_blank())
p <- p + opts(axis.title.x=theme_blank())
p <- p + opts(axis.text.x = theme_blank())
p <- p + opts(axis.title.y=theme_blank())
p <- p + opts(axis.text.y = theme_blank())

p + coord_flip()

Resultado:

ingrese la descripción de la imagen aquí

... el código puede ser un poco feo pero funciona de la manera correcta.

Yuriy Petrovskiy
fuente
2

Aquí está la implementación mía de sus soluciones. He decidido no asignar el valor medio, no queda mucho espacio. También la línea del 0 al 1 parece extraña. Muchas gracias a todos.

data <- read.table("roc_average.txt")
bxp <- boxplot(data, horizontal = TRUE, range = 0, axes = FALSE, col = "grey", add = TRUE, at = 0.2, varwidth=FALSE, boxwex=0.3)
valuelabels <- c(round(fivenum(data)[2], digits = 2), round(fivenum(data)[4], digits = 2))
text(x = valuelabels, y = c(0.35, 0.35), labels = valuelabels, font = 2)
mtext(c(min(round(data, digits = 2)),max(round(data, digits = 2))), side=1, at=bxp$stats[c(1,5)], line=-3, font = 2)

curva de roc con diagrama de caja

Vladimir Chupakhin
fuente
¿Se supone que el diagrama de caja resume las AUC? Si es así, ¿por qué el valor mínimo es 0.5?
chl
sí, parece extraño, porque varios ROC deberían estar por debajo de 0.5. Desenterrando lo que está mal ...
Vladimir Chupakhin
Ese es el punto en el que he invertido el ROC AUC para valores por debajo de 0.5, por lo que los gráficos deben rehacerse. ¡Muchas gracias!
Vladimir Chupakhin
+1 por volver, estoy esperando tu actualización. Si está trabajando con diferentes clasificadores, puede echar un vistazo a ROCR .
chl
Hice la curva ROC con ROCR
Vladimir Chupakhin el