11 votos

Etiquetando boxplots en R

Necesito construir un boxplot sin ejes y añadirlo a la gráfica actual (curva ROC), pero necesito añadir más información de texto al boxplot: las etiquetas para el mínimo y el máximo. La línea actual del código está abajo (el 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 añadir 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

enter image description here

9voto

Alan Puntos 7273

Creo que esto produce algo parecido a 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 with value labels

Probablemente haya mejores formas de hacerlo. Es posible que tenga que adaptarlo para que se ajuste a su parcela ROC, incluyendo el cambio de add = FALSE

1 votos

Bueno, tu respuesta parece más cercana a lo preguntado por el OP (por lo que he +1). Sin embargo, me parece que esto ya no es un boxplot, o al menos pierde su interés en la detección de un posible valor periférico. Cabe destacar que se puede personalizar un poco más el boxplot (ver el pars para reducir su relación de aspecto ( boxwex ) y el tamaño de los bigotes ( staplewex )).

8voto

DavLink Puntos 101

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 cierta información al llamar a boxplot En particular, los "cinco números".

Si quiere que se superponga a otro gráfico, utilice add=T pero sustituye mtext por text ; tendrá que establecer un $y$ (que dependen de la forma de trazar el otro gráfico).

Un ejemplo más completo fue dado por John Maindonald (el código debería estar en su página web):

enter image description here

3voto

Sonia Puntos 41

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:

enter image description here

...el código puede ser un poco feo, pero funciona bien.

2voto

Sean Howe Puntos 115

Aquí está la implementación mía de sus soluciones. He decidido no mapear el valor medio, no queda mucho espacio. También la línea de 0 a 1 parece impar. 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)

roc curve with boxplot

0 votos

¿Se supone que el boxplot resume el AUC? Si es así, ¿por qué el valor mínimo es = 0,5?

0 votos

sip, parece extraño, porque varios ROC debe ser inferior a 0,5. Desenterrar lo que está mal ...

0 votos

Ese es el punto en el que he invertido el ROC AUC para valores inferiores a 0,5, por lo que habría que rehacer los gráficos. Muchas gracias.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X