ปัญหาหลักที่ OP ดูเหมือนจะมีคือพวกเขามีข้อมูลที่มีน้ำหนักน้อยมากและฉันไม่คิดว่าคำตอบปัจจุบันส่วนใหญ่จะจัดการกับปัญหานั้นจริง ๆเลยดังนั้นฉันจึงส่งเสริมความคิดเห็นก่อนหน้าของฉันให้เป็นคำตอบ
หากคุณไม่ต้องการอยู่กับบ็อกซ์พล็อตมีตัวเลือกบางรายการด้านล่าง ฉันได้สร้างข้อมูลใน R ซึ่งแสดงปัญหาพื้นฐาน:
set.seed(seed=7513870)
x <- rcauchy(80)
boxplot(x,horizontal=TRUE,boxwex=.7)
ข้อมูลครึ่งกลางจะลดลงเป็นแถบเล็ก ๆ กว้างไม่กี่มิลลิเมตร ปัญหาเดียวกันนี้จะส่งผลต่อข้อเสนอแนะอื่น ๆ ซึ่งรวมถึงแปลง QQ, แผนภูมิแท่ง, แปลงรังผึ้งแบบผึ้ง / รังผึ้งและแปลงไวโอลิน
ตอนนี้วิธีแก้ปัญหาที่อาจเกิดขึ้น:
1) การเปลี่ยนแปลง ,
หากบันทึกหรือผู้ผกผันสร้างกล่องสี่เหลี่ยมที่อ่านได้อาจเป็นความคิดที่ดีมากและมาตราส่วนดั้งเดิมยังคงสามารถแสดงบนแกนได้
ปัญหาใหญ่คือบางครั้งไม่มีการเปลี่ยนแปลง 'ใช้งานง่าย' มีปัญหาเล็ก ๆ ที่ในขณะที่ควอนไทล์ตัวเองแปลด้วยการแปลงแบบโมโนโทนิกได้ดีพอรั้วไม่ได้ หากคุณเพียงแค่ใส่กล่องแปลงข้อมูลที่แปลง (อย่างที่ฉันทำที่นี่) หนวดจะมีค่า x ที่แตกต่างจากในแปลงดั้งเดิม
ที่นี่ฉันใช้ inverse-hyperbolic-sin (asinh); มันเหมือนกับ log ในหางและคล้ายกับ linear ใกล้ศูนย์ แต่คนทั่วไปไม่คิดว่ามันเป็นการแปลงแบบสัญชาตญาณดังนั้นโดยทั่วไปฉันจะไม่แนะนำตัวเลือกนี้เว้นแต่ว่าการเปลี่ยนแปลงที่เข้าใจง่ายเช่น log จะชัดเจน รหัสสำหรับ:
xlab <- c(-60,-20,-10,-5,-2,-1,0,1,2,5,10,20,40)
boxplot(asinh(x),horizontal=TRUE,boxwex=.7,axes=FALSE,frame.plot=TRUE)
axis(1,at=asinh(xlab),labels=xlab)
2) การแบ่งสเกล - ใช้ค่าผิดปกติมากและบีบอัดเข้าไปในหน้าต่างแคบ ๆ ที่ปลายแต่ละด้านด้วยสเกลที่ถูกบีบอัดมากขึ้นกว่าที่กึ่งกลาง ฉันขอแนะนำให้หยุดพักแบบสมบูรณ์ทั่วทั้งสเกลหากคุณทำสิ่งนี้
opar <- par()
layout(matrix(1:3,nr=1,nc=3),heights=c(1,1,1),widths=c(1,6,1))
par(oma = c(5,4,0,0) + 0.1,mar = c(0,0,1,1) + 0.1)
stripchart(x[x< -4],pch=1,cex=1,xlim=c(-80,-5))
boxplot(x[abs(x)<4],horizontal=TRUE,ylim=c(-4,4),at=0,boxwex=.7,cex=1)
stripchart(x[x> 4],pch=1,cex=1,xlim=c(5,80))
par(opar)
3) การตัดค่าผิดปกติอย่างรุนแรง (ซึ่งโดยปกติฉันจะไม่แนะนำโดยไม่ระบุอย่างชัดเจน แต่ดูเหมือนว่าพล็อตต่อไปโดยไม่มี "<5" และ "2>" ที่ปลายทั้งสอง) และ
4) สิ่งที่ฉันจะเรียกว่า "ลูกศร" สุดขั้ว - คล้ายกับการเล็ม แต่มีการนับจำนวนของค่าที่ตัดซึ่งระบุไว้ที่ปลายแต่ละด้าน
xout <- boxplot(x,range=3,horizontal=TRUE)$out
xin <- x[!(x %in% xout)]
noutl <- sum(xout<median(x))
nouth <- sum(xout>median(x))
boxplot(xin,horizontal=TRUE,ylim=c(min(xin)*1.15,max(xin)*1.15))
text(x=max(xin)*1.17,y=1,labels=paste0(as.character(nouth)," >"))
text(x=min(xin)*1.17,y=1,labels=paste0("< ",as.character(noutl)))