Dán nhãn boxplots trong R


11

Tôi cần xây dựng một boxplot mà không có bất kỳ trục nào và thêm nó vào âm mưu hiện tại (đường cong ROC), nhưng tôi cần thêm nhiều thông tin văn bản vào boxplot: các nhãn cho min và max. Dòng mã hiện tại ở bên dưới (biểu đồ hiện tại cũng vậy).

Cảm ơn rất nhiều vì đã giúp đỡ.

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

Giải pháp khác là thêm dòng từ 0 đến 1 (thay vì trục x), nhưng tôi muốn nó đi qua dòng trung tâm ... ví dụ như đồ họa này

nhập mô tả hình ảnh ở đây

Câu trả lời:


9

Tôi nghĩ rằng bạn sẽ tìm thấy điều này tạo ra một cái gì đó giống như sơ đồ vẽ tay của bạn.

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 với nhãn giá trị

Có lẽ có nhiều cách tốt hơn để làm điều đó. Bạn có thể cần điều chỉnh nó để phù hợp với cốt truyện ROC của mình, bao gồm cả việc thay đổiadd = FALSE


1
Chà, câu trả lời của bạn có vẻ gần với những gì được OP yêu cầu (vì vậy tôi đã +1). Tuy nhiên, tôi cảm thấy như đây không còn là một boxplot nữa, hoặc ít nhất là nó mất đi sự quan tâm đến việc phát hiện ra giá trị ngoại lai có thể. Lưu ý, bạn có thể tùy chỉnh thêm một chút boxplot (xem các parsđối số để giảm tỷ lệ khung hình của nó ( boxwex) và kích thước của râu ( staplewex)).
chl

8

Hãy thử một cái gì đó như thế này cho một phiên bản độc lập:

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

Lưu ý rằng bạn có thể nhận được một số thông tin khi gọi boxplot, đặc biệt là "năm số".

add=Tmtexttexty

Một ví dụ đầy đủ hơn được đưa ra bởi John Maindonald (mã nên có trên trang web của anh ấy):

nhập mô tả hình ảnh ở đây


3

Hoàn toàn tùy biến 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()

Kết quả:

nhập mô tả hình ảnh ở đây

... mã có thể hơi xấu nhưng hoạt động đúng cách.


2

Đây là của tôi thực hiện các giải pháp của bạn. Tôi đã quyết định không ánh xạ giá trị trung bình, không còn nhiều khoảng trống. Ngoài ra dòng từ 0 đến 1 có vẻ kỳ lạ. Cảm ơn mọi người rất nhiều.

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)

đường cong roc với boxplot


Boxplot được cho là tóm tắt AUC? Nếu vậy, tại sao giá trị tối thiểu = 0,5?
chl 17/03

vâng, có vẻ lạ, vì một số ROC nên dưới 0,5. Khai thác những gì sai ...
Vladimir Chupakhin

Đó là điểm tôi đã đảo ngược ROC AUC cho các giá trị dưới 0,5, vì vậy đồ họa nên được làm lại. Cảm ơn rất nhiều!
Vladimir Chupakhin

+1 để quay lại, tôi đang chờ cập nhật của bạn. Nếu bạn đang làm việc với các trình phân loại khác nhau, bạn có thể xem ROCR .
chl

Tôi đã thực hiện đường cong ROC với ROCR
Vladimir Chupakhin
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.