Étiquetage des boîtes à moustaches en R

11

J'ai besoin de construire un boxplot sans aucun axe et de l'ajouter au tracé actuel (courbe ROC), mais j'ai besoin d'ajouter plus d'informations textuelles au boxplot: les étiquettes pour min et max. La ligne de code actuelle est ci-dessous (graphique actuel également).

Merci beaucoup pour votre aide.

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

L'autre solution est d'ajouter la ligne de 0 à 1 (au lieu de l'axe des x), mais je veux qu'elle passe par la ligne centrale ... par exemple comme ce graphique

entrez la description de l'image ici

Vladimir Chupakhin
la source

Réponses:

9

Je pense que vous constaterez que cela produit quelque chose comme votre diagramme dessiné à la main.

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)

Boxplot R avec étiquettes de valeur

Il existe probablement de meilleures façons de procéder. Vous devrez peut-être l'adapter à votre parcelle ROC, y compris en changeantadd = FALSE

Henri
la source
1
Eh bien, votre réponse semble plus proche de ce qui a été demandé par le PO (donc j'ai +1). Cependant, j'ai l'impression que ce n'est plus un boxplot, ou du moins il perd son intérêt à repérer une éventuelle valeur périphérique. À noter, vous pouvez personnaliser un peu plus le boxplot (voir les parsarguments pour réduire son rapport d'aspect ( boxwex) et la taille des moustaches ( staplewex)).
chl
8

Essayez quelque chose comme ceci pour une version autonome:

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

Notez que vous pouvez obtenir des informations lors de l'appel boxplot, en particulier les "cinq numéros".

Si vous souhaitez qu'il soit superposé à un autre graphique, utilisez add=Tmais remplacez mtextpar text; vous devrez définir une valeur (qui dépend de la façon dont vous tracez l'autre graphique).y

Un exemple plus complet a été donné par John Maindonald (le code devrait être sur son site Web):

entrez la description de l'image ici

chl
la source
3

Boxplot ggplot2 entièrement personnalisable ...

#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()

Résultat:

entrez la description de l'image ici

... le code est peut-être un peu moche mais fonctionne correctement.

Yuriy Petrovskiy
la source
2

Voici la mise en œuvre de mes solutions. J'ai décidé de ne pas cartographier la valeur moyenne, il n'y a pas trop d'espace libre. De plus, la ligne de 0 à 1 semble étrange. Merci beaucoup à tous.

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)

courbe roc avec boxplot

Vladimir Chupakhin
la source
Le boxplot est censé résumer l'AUC? Si oui, pourquoi la valeur min = 0,5?
chl
oui, cela semble étrange, car plusieurs ROC devraient être inférieurs à 0,5. Déterrer ce qui ne va pas ...
Vladimir Chupakhin
C'est le point que j'ai inversé l'AUC ROC pour les valeurs inférieures à 0,5, donc les graphiques doivent être refaits. Merci beaucoup!
Vladimir Chupakhin
+1 pour revenir, j'attends votre mise à jour. Si vous travaillez avec différents classificateurs, vous pourriez jeter un œil à ROCR .
chl
J'ai fait une courbe ROC avec ROCR
Vladimir Chupakhin