Beschriften von Boxplots in R.

11

Ich muss ein Boxplot ohne Achsen erstellen und es dem aktuellen Plot (ROC-Kurve) hinzufügen, aber ich muss dem Boxplot weitere Textinformationen hinzufügen: die Beschriftungen für min und max. Die aktuelle Codezeile befindet sich unten (aktuelle Grafik ebenfalls).

Vielen Dank für die Unterstützung.

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

Die andere Lösung besteht darin, die Linie von 0 bis 1 (anstelle der x-Achse) hinzuzufügen, aber ich möchte, dass sie durch die Mittellinie verläuft ... zum Beispiel wie diese Grafik

Geben Sie hier die Bildbeschreibung ein

Vladimir Chupakhin
quelle

Antworten:

9

Ich denke, Sie werden feststellen, dass dies so etwas wie Ihr handgezeichnetes Diagramm ergibt.

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 mit Wertelabels

Es gibt wahrscheinlich bessere Möglichkeiten, dies zu tun. Möglicherweise müssen Sie es an Ihr ROC-Diagramm anpassen, einschließlich Änderungenadd = FALSE

Henry
quelle
1
Nun, Ihre Antwort scheint eher dem zu entsprechen, was vom OP gefragt wurde (also habe ich +1). Ich habe jedoch das Gefühl, dass dies kein Boxplot mehr ist oder zumindest sein Interesse daran verliert, mögliche äußere Werte zu erkennen. Zu beachten ist, dass Sie das Boxplot etwas mehr anpassen können (siehe die parsArgumente zur Reduzierung des Seitenverhältnisses ( boxwex) und der Größe der Whisker ( staplewex)).
Chl
8

Versuchen Sie so etwas für eine eigenständige Version:

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

Beachten Sie, dass Sie beim Anrufen einige Informationen erhalten können boxplot, insbesondere die "fünf Nummern".

add=Tmtexttexty

Ein vollständigeres Beispiel gab John Maindonald (Code sollte auf seiner Website sein):

Geben Sie hier die Bildbeschreibung ein

chl
quelle
3

Vollständig anpassbares 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()

Ergebnis:

Geben Sie hier die Bildbeschreibung ein

... Code vielleicht ein bisschen hässlich, funktioniert aber richtig.

Yuriy Petrovskiy
quelle
2

Hier ist meine Implementierung Ihrer Lösungen. Ich habe beschlossen, den Mittelwert nicht abzubilden, da nicht mehr viel Platz übrig ist. Auch die Linie von 0 bis 1 scheint seltsam. Vielen Dank an alle.

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-Kurve mit Boxplot

Vladimir Chupakhin
quelle
Das Boxplot soll die AUC zusammenfassen? Wenn ja, warum ist der Mindestwert = 0,5?
Chl
Ja, scheint seltsam, weil mehrere ROC unter 0,5 liegen sollten. Ausgraben, was los ist ...
Vladimir Chupakhin
Das ist der Punkt, an dem ich die ROC-AUC für Werte unter 0,5 invertiert habe, daher sollten die Grafiken neu erstellt werden. Danke vielmals!
Vladimir Chupakhin
+1 für die Rückkehr, ich warte auf Ihr Update. Wenn Sie mit verschiedenen Klassifikatoren arbeiten, sehen Sie sich möglicherweise ROCR an .
Chl
Ich habe ROC-Kurve mit ROCR
Vladimir Chupakhin