Boxplot สำหรับการกระจายหลาย ๆ


9

ฉันต้องวาดการแจกแจง 20 ครั้งในกราฟเดียวใน R และมันก็ดูไม่ดี (รก) กับฉันด้วย boxplot ปกติ (20 กล่อง) แม้กับ boxwex = 0.3 คุณช่วยแนะนำฉันได้ไหมว่าฉันจะพล็อตบ็อกซ์พล็อตใน R สำหรับการแจกแจง 20 แบบด้วยจุดสำหรับค่ามัธยฐานและแค่บรรทัดแทนที่จะเป็นกล่องได้อย่างไรเช่นด้านล่าง โปรดแนะนำฉันด้วยหากมีวิธีการ R ที่สร้าง boxplots ที่ดีโดยเฉพาะถ้าคุณต้องการแสดงการแจกแจงหลาย ๆ อย่างในกราฟเดียว

 -----0----

คำตอบ:


12

(นี่เป็นความคิดเห็นจริงๆ แต่เนื่องจากต้องมีภาพประกอบจึงต้องโพสต์เป็นการตอบกลับ)

Ed Tufte ได้ออกแบบ boxplot ใหม่ในการแสดงผลข้อมูลเชิงปริมาณ (หน้า 125, ฉบับพิมพ์ครั้งแรกของปี 1983) อย่างแม่นยำเพื่อเปิดใช้งาน "การวิเคราะห์ข้อมูลแบบไม่เป็นทางการสำรวจข้อมูลโดยที่เวลาของคนทำงานวิจัย ฉันมี (ในลักษณะที่เป็นธรรมชาติอย่างสมบูรณ์) ขยายการออกแบบของเขาเพื่อรองรับค่าใช้จ่ายการวาดภาพในตัวอย่างนี้แสดงกล่องสี่เหลี่ยม 70 ขนาน:

แปลงกล่อง Tufte

ฉันคิดหลายวิธีในการปรับปรุงเพิ่มเติมนี้ แต่มันเป็นลักษณะของสิ่งที่อาจเกิดขึ้นในความร้อนของการสำรวจชุดข้อมูลที่ซับซ้อน: เราเป็นเนื้อหาที่จะสร้างภาพข้อมูลที่ให้เราเห็นข้อมูล; การนำเสนอที่ดีสามารถมาในภายหลัง

เปรียบเทียบสิ่งนี้กับการเรนเดอร์แบบเดิมของข้อมูลเดียวกัน:

กล่องแปลงธรรมดา

Tufte นำเสนอการออกแบบอื่น ๆ อีกมากมายตามหลักการของเขาที่ว่า "การเพิ่มอัตราส่วนหมึกข้อมูล" ให้สูงสุด คุณค่าของพวกเขาอยู่ในการแสดงให้เห็นว่าหลักการนี้สามารถช่วยให้เราออกแบบกราฟิกสำรวจที่มีประสิทธิภาพได้อย่างไร อย่างที่คุณเห็นกลไกของการพล็อตมันเป็นจำนวนเงินเพื่อค้นหาแพลตฟอร์มกราฟิกใด ๆ ที่คุณสามารถวาดเครื่องหมายจุดและเส้น


คุณสามารถช่วยในการวาดกราฟบนสุดใน R หรือไม่?
samarasa

1
@kkp นี่เป็นร่างหยาบ การตอบสนองที่ดี (+1)
chl

และนี่คือความเป็นไปได้เพิ่มเติมใน R - พบได้บน SO: ฟังก์ชั่นที่มีให้สำหรับกล่องสี่เหลี่ยม Tufte ใน R? .
chl

@chl ขอบคุณสำหรับลิงค์ สำหรับเร็กคอร์ดนั้นจะมีโค้ด R ที่ใช้งานได้สำหรับการสร้าง boxplots ที่ออกแบบใหม่เหล่านี้ น่าสนใจคำถามนั้นถูกโพสต์เมื่อสามวันหลังจากนี้ ...
whuber

1
@ ไม่มีข้อสังเกตที่น่าสนใจ การใช้งาน boxplots หนึ่งที่อาจเกิดขึ้นได้คือตัวแปรของแผนการพเนจรพเนจรของ Tukey ที่ scatterplot (ใหญ่) ถูกกระจายไปตามพิกัด x และค่า y ถูกสรุปโดย boxplot ในแต่ละ bin กระบวนการดังกล่าวสามารถสร้างบ็อกซ์บ็อกซ์แบบคู่ขนานได้ 70 หรือมากกว่า แอปพลิเคชันรวมข้อมูลเกือบมิติหลายมิติ: ตัวอย่างเช่นพิกัด x อาจแทนความลึกของดินที่สุ่มตัวอย่างทุกเซนติเมตรและพิกัด y อาจแสดงข้อมูลที่ได้จากหลายตำแหน่ง
whuber

10

Beanplots

อาจเป็นแปลงที่ยอดเยี่ยมที่สุดเท่าที่เคยมีมานี่คือการใช้ไวโอลินขนาดเล็กหลายรายการ แผนการของไวโอลินมีข้อได้เปรียบอย่างใหญ่หลวงเหนือ boxplots: พวกเขาสามารถแสดงรายละเอียดได้มากขึ้นสำหรับการแจกแจงที่ไม่ปกติ (เช่นพวกเขาสามารถแสดงการแจกแจงแบบสองกิริยาได้ดีจริงๆ) เนื่องจากโดยทั่วไปแล้วพวกเขาจะขึ้นอยู่กับการปรับให้เรียบแบบเกาส์เซียน (หรือคล้ายกัน) พวกเขาจะทำงานได้ไม่ดีนักสำหรับการแจกแจงที่มีคะแนนสูง (เช่นการแจกแจงแบบเอ็กซ์โปเนนเชียล) แต่จากนั้นจะไม่ boxplots

Beanplots สามารถทำได้อย่างง่ายดายใน R - เพียงแค่ติดตั้งแพคเกจbeanplot :

library(beanplot)

# Sampling code from Greg Snow's answer:
my.dat <- lapply( 1:20, function(x) rnorm(x+10, sample( 10, 1), sample(3,1) ) )

beanplot(my.dat)

Beanplot!

beanplotฟังก์ชั่นมีตันของตัวเลือกเพื่อให้คุณสามารถปรับแต่งให้ความปรารถนาของหัวใจของคุณ นอกจากนี้ยังมีวิธีการทำbeanplots ใน ggplot2 (ต้องการรุ่นล่าสุด):

library(ggplot2)

my.dat <- lapply(1:20, function(x) rnorm(x+10, sample(10, 1), sample(3,1)))
my.df <- melt(my.dat)
ggplot(my.df, aes(x=L1, y=value, group=L1)) + geom_violin(trim=FALSE) +
  geom_segment(aes(x=L1-0.1, xend=L1+0.1, y=value, yend=value), colour='white')

GGplot2 beanplot


3

นี่คือตัวอย่างรหัส R สำหรับสองสามวิธีที่จะทำคุณอาจต้องการขยายในส่วนนี้ (รวมถึงป้ายกำกับ ฯลฯ ) และอาจเปลี่ยนเป็นฟังก์ชัน:

my.dat <- lapply( 1:20, function(x) rnorm(x+10, sample( 10, 1), sample(3,1) ) )

tmp <- boxplot(my.dat, plot=FALSE, range=0)

# box and median only
plot( range(tmp$stats), c(1,length(my.dat)), xlab='', ylab='', type='n' )
segments( tmp$stats[2,], seq_along(my.dat), tmp$stats[4,] )
points( tmp$stats[3,], seq_along(my.dat) )

# wiskers and implied box
plot( range(tmp$stats), c(1,length(my.dat)), xlab='', ylab='', type='n' )
segments( tmp$stats[1,], seq_along(my.dat), tmp$stats[2,] )
segments( tmp$stats[4,], seq_along(my.dat), tmp$stats[5,] )
points( tmp$stats[3,], seq_along(my.dat) )

ป้อนคำอธิบายรูปภาพที่นี่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.