กราฟสำหรับความสัมพันธ์ระหว่างตัวแปรอันดับสอง


46

กราฟที่เหมาะสมในการแสดงความสัมพันธ์ระหว่างตัวแปรอันดับสองคืออะไร

ตัวเลือกเล็ก ๆ น้อย ๆ ที่ฉันนึกได้:

  1. พล็อตกระจายที่มีตัวสั่นแบบสุ่มเพิ่มเพื่อหยุดจุดที่ซ่อนซึ่งกันและกัน เห็นได้ชัดว่ากราฟิกมาตรฐาน - Minitab เรียกสิ่งนี้ว่า "พล็อตค่าแต่ละค่า" ในความคิดของฉันมันอาจจะทำให้เข้าใจผิดตามที่เห็นกระตุ้นให้เกิดการแก้ไขเชิงเส้นระหว่างสายตาระดับลำดับราวกับว่าข้อมูลมาจากช่วงขนาด
  2. พล็อตกระจายที่ดัดแปลงเพื่อให้ขนาด (พื้นที่) ของจุดแทนความถี่ของการรวมกันของระดับนั้นแทนที่จะวาดหนึ่งจุดสำหรับแต่ละหน่วยสุ่มตัวอย่าง ฉันได้เห็นแผนการดังกล่าวเป็นครั้งคราวในทางปฏิบัติ พวกมันอ่านยาก แต่จุดนั้นอยู่บนโครงตาข่ายที่เว้นระยะสม่ำเสมอซึ่งจะเอาชนะการวิพากษ์วิจารณ์พล็อตกระจายที่กระวนกระวายใจ
  3. โดยเฉพาะอย่างยิ่งหากหนึ่งในตัวแปรนั้นถือว่าเป็นแบบพึ่งพาได้พล็อตกล่องจะถูกจัดกลุ่มตามระดับของตัวแปรอิสระ มีแนวโน้มที่จะดูแย่มากหากจำนวนระดับของตัวแปรตามไม่สูงพอ ("แบน" มากกับหนวดที่หายไปหรือแย่ลง quartiles ซึ่งทำให้การระบุภาพของค่ามัธยฐานเป็นไปไม่ได้) แต่อย่างน้อยก็ดึงดูดความสนใจไปที่มัธยฐานและควอไทล์ สถิติเชิงพรรณนาที่เกี่ยวข้องสำหรับตัวแปรลำดับ
  4. ตารางค่าหรือกริดเปล่าของเซลล์พร้อมแผนที่ความร้อนเพื่อระบุความถี่ มองเห็นแตกต่างกัน แต่มีแนวคิดคล้ายกับพล็อตกระจายที่มีพื้นที่จุดแสดงความถี่

มีความคิดอื่น ๆ หรือความคิดที่ดีกว่าแปลงไหน มีการวิจัยในสาขาใดบ้างที่มีการพิจารณาแปลงตามลำดับ - vs-ordinal บางแปลงเป็นมาตรฐานหรือไม่? (ฉันดูเหมือนจะจำความถี่ heatmap ที่แพร่หลายในจีโนมิกส์ แต่สงสัยว่าเป็นบ่อยขึ้นสำหรับเล็กน้อย - vs - ชื่อ.) คำแนะนำสำหรับการอ้างอิงมาตรฐานที่ดีก็จะได้รับการต้อนรับมากฉันคาดเดาบางอย่างจาก Agresti

หากใครต้องการที่จะแสดงให้เห็นถึงพล็อตรหัส R สำหรับข้อมูลตัวอย่างปลอมดังต่อไปนี้

"การออกกำลังกายมีความสำคัญกับคุณมากแค่ไหน" 1 = ไม่สำคัญเลย 2 = ค่อนข้างไม่สำคัญ 3 = ไม่สำคัญหรือไม่สำคัญ 4 = ค่อนข้างสำคัญ 5 = สำคัญมาก

"คุณใช้เวลาอย่างน้อย 10 นาทีหรือนานกว่านี้เป็นประจำ" 1 = ไม่เคย, 2 = น้อยกว่าหนึ่งครั้งต่อสัปดาห์, 3 = ทุกๆหนึ่งหรือสองสัปดาห์, 4 = สองหรือสามครั้งต่อสัปดาห์, 5 = สี่หรือมากกว่าครั้งต่อสัปดาห์

ถ้ามันเป็นเรื่องธรรมดาที่จะถือว่า "บ่อยครั้ง" เป็นตัวแปรตามและ "ความสำคัญ" เป็นตัวแปรอิสระถ้าพล็อตแยกความแตกต่างระหว่างทั้งสอง

importance <- rep(1:5, times = c(30, 42, 75, 93, 60))
often <- c(rep(1:5, times = c(15, 07, 04, 03, 01)), #n=30, importance 1
           rep(1:5, times = c(10, 14, 12, 03, 03)), #n=42, importance 2
           rep(1:5, times = c(12, 23, 20, 13, 07)), #n=75, importance 3
           rep(1:5, times = c(16, 14, 20, 30, 13)), #n=93, importance 4
           rep(1:5, times = c(12, 06, 11, 17, 14))) #n=60, importance 5
running.df <- data.frame(importance, often)
cor.test(often, importance, method = "kendall") #positive concordance
plot(running.df) #currently useless

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


1
สิ่งที่เกี่ยวกับกระดูกสันหลัง?
Dimitriy V. Masterov

คำถามที่เกี่ยวข้องสำหรับการแสดงunivariateข้อมูลลำดับในหลายกลุ่มยังอาจเกี่ยวข้อง: แสดงลำดับข้อมูล - หมายถึงมีเดียและอันดับ Mean
สีเงิน

คำตอบ:


15

spineplot (mosaic plot) ทำงานได้ดีกับข้อมูลตัวอย่างที่นี่ แต่อาจอ่านหรือตีความได้ยากหากการรวมหมวดหมู่บางอย่างหายากหรือไม่มีอยู่จริง โดยธรรมชาติแล้วมันสมเหตุสมผลและคาดว่าความถี่ต่ำจะถูกนำเสนอโดยกระเบื้องขนาดเล็กและไม่มีศูนย์โดยกระเบื้องทั้งหมด แต่ความยากลำบากทางจิตวิทยาสามารถยังคงอยู่ เป็นเรื่องธรรมดาที่ผู้คนที่รักกระดูกสันหลังต้องเลือกตัวอย่างที่ทำงานได้ดีกับเอกสารหรืองานนำเสนอ แต่ฉันมักจะสร้างตัวอย่างที่ยุ่งเกินกว่าที่จะใช้ในที่สาธารณะ ในทางกลับกันกระดูกสันหลังจะใช้พื้นที่ที่มีอยู่อย่างดี

การใช้งานบางอย่างแสดงกราฟิกแบบอินเทอร์แอคทีฟเพื่อให้ผู้ใช้สามารถซักถามแต่ละไทล์เพื่อเรียนรู้เพิ่มเติมเกี่ยวกับมัน

อีกทางเลือกหนึ่งที่สามารถทำงานได้ค่อนข้างดีคือแผนภูมิแท่งแบบสองทิศทาง

ดูตัวอย่างtabplotภายในhttp://www.surveydesign.com.au/tipsusergraphs.html

สำหรับข้อมูลเหล่านี้พล็อตที่เป็นไปได้หนึ่งรายการ (ผลิตโดยใช้tabplotใน Stata แต่ควรง่ายในซอฟต์แวร์ที่เหมาะสม)

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

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

ความเป็นไปได้บางอย่าง:

  1. หากตัวแปรตัวใดตัวหนึ่งสามารถนึกถึงการตอบสนองต่ออีกคนหนึ่งว่าเป็นตัวทำนายได้มันก็ควรค่าที่จะวางแผนลงบนแกนตั้งตามปกติ ที่นี่ฉันคิดว่า "ความสำคัญ" เป็นการวัดทัศนคติคำถามก็คือว่ามันส่งผลกระทบต่อพฤติกรรม ("มักจะ") ปัญหาเชิงสาเหตุมักมีความซับซ้อนมากยิ่งขึ้นสำหรับข้อมูลจินตภาพเหล่านี้ แต่ประเด็นยังคงอยู่

  2. ข้อเสนอแนะ # 1 เสมอที่จะกุเรื่องถ้าย้อนกลับทำงานได้ดีขึ้นความหมายง่ายต่อการคิดและตีความ

  3. เปอร์เซ็นต์หรือความน่าจะเป็นที่จะเกิดความล้มเหลว พล็อตของความถี่ดิบจะมีประโยชน์เช่นกัน (ตามธรรมชาติแล้วพล็อตนี้ขาดความสมบูรณ์ของพล็อตโมเสกในการแสดงข้อมูลทั้งสองชนิดในครั้งเดียว)

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

  5. บางคนอาจต้องการสีหมวดหมู่การตอบสนองที่แตกต่างกันแตกต่างกัน ฉันไม่คัดค้านและถ้าคุณต้องการให้คุณไม่คัดค้านอย่างจริงจัง แต่อย่างใด

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


ขอบคุณที่เพิ่มกราฟิก นี่ทำให้เกิดประเด็นที่กราฟิกและข้อมูลที่เป็นข้อความรวมกัน - ฉันรู้ว่าบางคนไม่ชอบใส่ตัวเลขที่ด้านบนของแท่ง (เพราะมันทำให้แท่งปรากฏสูงกว่าที่พวกเขาเป็นจริงฉันไม่ได้มีการอ้างอิง แต่ฉันคิดว่ามันเป็นความเห็นที่รู้จักกันดี)
Silverfish

ในทางกลับกันการกำหนดตำแหน่งของหมายเลขดูเหมือนจะสร้างหนึ่งในสองปัญหา: ทั้งตัวเลขสามารถวางทับบนแถบซึ่งบดบังพวกเขาหรือแก้ไขหมายเลขด้านบนแท่งสามารถ "ปลด" พวกเขาจากแถบด้านล่าง โดยเฉพาะอย่างยิ่ง. มีการอภิปรายที่ดีของปัญหาเหล
Silverfish

ฉันไม่คิดว่าคุณต้องมีการอ้างอิง มันเป็นทัศนคติทั่วไป ฉันเห็นตัวแปรอื่น ๆ : (1) คำแนะนำเฉพาะของจอแสดงผลที่จอแสดงผลยุ่งเกินไปไม่เป็นระเบียบ ฯลฯ (2) การอุทธรณ์ต่อความคิดที่ว่าข้อความที่เป็นตัวเลขซ้ำซ้อนเพราะข้อมูลเดียวกันมีความหมายโดยนัย ) ในกราฟในทางใดทางหนึ่ง (3) ทัศนคติ "เด็กผู้ชายสวมใส่สีน้ำเงินและเด็กผู้หญิงสวมใส่สีชมพู" ว่าตัวเลขเป็นตัวเลขและตารางเป็นตารางและไม่เคยมีทั้งคู่ (3) นัดฉันเป็นอคติที่บริสุทธิ์; (2) ถูกต้องในหลักการ แต่ตัวเลขก็สามารถช่วยได้ (1) จะต้องมีการคิดผ่านตัวอย่างโดยตัวอย่าง
Nick Cox

ฉันไม่ทราบการอภิปรายของการแลกเปลี่ยนที่เฉพาะเจาะจง การทิ้งแท่งไว้โดยไม่ให้สีเพื่อให้ตัวเลขที่สามารถใส่เข้าไปข้างในนั้นเป็นความคิดที่ดี บางครั้งแถบอาจเล็กเกินไปที่จะทำเช่นนี้ได้ตลอดเวลา
Nick Cox

30

นี่คือความพยายามที่รวดเร็วในแผนที่ความร้อนฉันใช้เส้นขอบสีดำเพื่อแยกเซลล์ แต่บางทีกระเบื้องควรจะแยกกันมากขึ้นตามคำตอบของ Glen_b

Heatmap

library(ggplot2)
runningcounts.df <- as.data.frame(table(importance, often))
ggplot(runningcounts.df, aes(importance, often)) +
   geom_tile(aes(fill = Freq), colour = "black") +
   scale_fill_gradient(low = "white", high = "steelblue")

นี่คือพล็อตความผันผวนตามความคิดเห็นก่อนหน้านี้โดย Andy W. ในขณะที่เขาอธิบายพวกเขา "โดยพื้นฐานแล้วพวกเขาเป็นเพียงแค่ scatterplots สำหรับข้อมูลเชิงหมวดหมู่และขนาดของจุดถูกแมปกับจำนวนการสังเกตที่อยู่ในถังขยะนั้น" สำหรับการอ้างอิงดู

Wickham, Hadley และ Heike Hofmann 2011 แปลงสินค้า ธุรกรรมอีอีอีการแสดงและคอมพิวเตอร์กราฟิก (พรอ. Infovis `11) พิมพ์ PDF ล่วงหน้า

พล็อตความผันผวน

theme_nogrid <- function (base_size = 12, base_family = "") {
  theme_bw(base_size = base_size, base_family = base_family) %+replace% 
    theme(panel.grid = element_blank())   
}

ggplot(runningcounts.df, aes(importance, often)) +
  geom_point(aes(size = Freq, color = Freq, stat = "identity", position = "identity"), shape = 15) +
  scale_size_continuous(range = c(3,15)) + 
  scale_color_gradient(low = "white", high = "black") +
  theme_nogrid()

1
" บางทีกระเบื้องควรจะแยกกันมากขึ้นตามคำตอบของ Glen_b " - ฉันไม่แน่ใจว่าจำเป็นในกรณีนี้มีการล่อลวงน้อยกว่าเมื่อดูหมวดหมู่ที่นี่อย่างต่อเนื่อง
Glen_b

18

นี่คือตัวอย่างของลักษณะของข้อมูลที่ดูเหมือนว่า ผมทำอย่างนี้ใน Stata สวยได้อย่างรวดเร็ว แต่มีการดำเนินการวิจัย ฉันคิดว่าใน R มันควรจะเป็นเพียงแค่:

spineplot(factor(often)~factor(importance))

Spineplot จริง ๆ แล้วน่าจะเป็นค่าเริ่มต้นถ้าคุณให้ตัวแปร R เด็ดขาด:

plot(factor(often)~factor(importance))

การแยกส่วนของหมวดหมู่มักจะแสดงสำหรับแต่ละหมวดหมู่ที่มีความสำคัญ แท่งแบบเรียงซ้อนจะถูกวาดด้วยมิติแนวตั้งซึ่งแสดงเศษส่วนของประเภทที่มีความสำคัญ มิติแนวนอนแสดงเศษส่วนในแต่ละประเภทความสำคัญ ดังนั้นพื้นที่ของกระเบื้องที่เกิดขึ้นเป็นตัวแทนของความถี่หรือผลรวมโดยทั่วไปสำหรับแต่ละการรวมกันของความสำคัญและบ่อยครั้ง

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


1
ฉันเปลี่ยนมันไปรอบ ๆ
Dimitriy V. Masterov

1
การอ้างอิง Nick Cox (ผู้เขียนสปินพล็อตของ Stata): ข้อ จำกัด ของตัวแปรสองตัวนั้นชัดเจนกว่าของจริง ตัวแปรคอมโพสิตอาจถูกสร้างขึ้นโดยการผสมข้ามกันของตัวแปรเด็ดขาดสองตัวหรือมากกว่า ... โดยปกติแล้วตัวแปรตอบสนองจะแสดงได้ดีกว่าบนแกน y หากตัวแปรหนึ่งเป็นเลขฐานสองก็มักจะดีกว่าที่จะลงจุดนั้นบนแกน y โดยธรรมชาติอาจมีความตึงเครียดระหว่างคำแนะนำเหล่านี้
Dimitriy V. Masterov

3
ฉันเห็นด้วยกับข้างต้น แต่รูปแบบเริ่มต้นของ Stata colo [u] r นั้นค่อนข้างน่ารังเกียจสำหรับตัวแปรอันดับ ทางเลือกที่ดีหลายอย่างเป็นเฉดสีที่แตกต่างกันของสีแดงและ / หรือสีน้ำเงินหรือเพียงแค่ตัวเลือก yscale {{| |}}
Nick Cox

3
@ Dimitriy ฉันคิดว่ามันแปลกมากที่จะใช้สีผสมโดยพลการในสถานการณ์เดียวกัน! ฉันไม่ได้บ่งบอกถึงหรืออนุมานอะไรจากหรือจากสีที่แน่นอน แต่ปริมาณ แต่ประเด็นก็คือมีเพียงระดับคะแนนที่เข้ากันกับลำดับของสี มีความเด็ดขาดในการระบายสีแผนที่ความร้อนด้วยเช่นกันและในการทำแผนที่เฉพาะเรื่องหลายชนิด
Nick Cox

2
ฉันไม่เห็นปัญหาเกี่ยวกับโทนสีที่ให้คะแนนตราบใดที่สีแตกต่างกัน ทำไมทุกคนจะถูกล่อลวงให้แก้ไข? ฉันไม่เห็นตรรกะของสีใด ๆ ลำดับสายรุ้งมีความหมายในวิชาฟิสิกส์ แต่ไม่ใช่ในแง่ของวิธีการที่ผู้คนรับรู้สี (เช่นสีเหลืองและสีแดงนั้นแตกต่างกันเกินไป) ฉันมีหลักฐานในแง่ของการพูดคุยกับนักเรียนหลายคนผ่านทางเลือกและฉันจะบอกว่า 80% พูดอย่างจริงใจว่า "ดีกว่านั้นมาก" เมื่อพวกเขาเห็นลำดับขั้นอย่างละเอียดเหนือรุ้งหรือสลัดผลไม้ สีน้ำเงินผ่านสีฟ้าอ่อนผ่านสีแดงอ่อนถึงสีแดงใช้ได้ดี ให้แน่ใจว่าคุณลองผู้หญิงและผู้ชาย
Nick Cox

13

วิธีที่ฉันทำนี่เป็นเรื่องเหลวไหลเล็กน้อย แต่มันสามารถแก้ไขได้ง่ายพอ

นี่เป็นเวอร์ชันที่แก้ไขแล้วของวิธีการทำให้สั่นสะเทือน

การถอดแกนจะช่วยลดการล่อลวงในการตีความสเกลอย่างต่อเนื่อง กล่องวาดรอบชุดค่าผสมที่มีการเน้นจะเน้นบางอย่างเช่น "ตัวแบ่งส่วนขยาย" ซึ่งช่วงเวลาไม่จำเป็นต้องเท่ากัน

ตามหลักการแล้วฉลาก 1..5 ควรถูกแทนที่ด้วยชื่อหมวดหมู่ แต่ฉันจะทิ้งเรื่องนั้นไว้เพื่อจินตนาการในตอนนี้ ฉันคิดว่ามันสื่อถึงความรู้สึกของมัน

 plot(jitter(often)~jitter(importance),data=running.df,bty="n",
    ylim=c(0.5,5.5),xlim=c(0.5,5.5),cex=0.5,pty="s",xaxt="n",yaxt="n") 
 axis(1,tick=TRUE,col=0)
 axis(2,tick=TRUE,col=0)
 rect(rep(seq(0.75,4.75,1),5),rep(seq(0.75,4.75,1),each=5),
       rep(seq(1.25,5.25,1),5),rep(seq(1.25,5.25,1),each=5),
       border=8)

พล็อตลำดับที่เรียงลำดับ


การปรับแต่งที่เป็นไปได้:

i) ทำให้การแบ่งมีขนาดเล็กลง (ฉันชอบการหยุดพักที่ใหญ่กว่านี้เป็นการส่วนตัว) และ

ii) พยายามใช้ลำดับ quasirandom เพื่อลดอุบัติการณ์ของรูปแบบที่ชัดเจนภายในกล่อง ในขณะที่ความพยายามของฉันช่วยบ้างคุณจะเห็นว่าในเซลล์ที่มีจำนวนจุดน้อยกว่านั้นยังคงมีองค์ประกอบที่มีความสัมพันธ์มากขึ้นหรือน้อยลง (เช่นกล่องในแถวด้านบนคอลัมน์ที่ 2) เพื่อหลีกเลี่ยงปัญหานั้นลำดับกึ่งสุ่มอาจต้องเริ่มต้นสำหรับแต่ละกล่องย่อย (ทางเลือกอาจเป็นการสุ่มตัวอย่าง Latin Hypercube) เมื่อถูกแยกออกแล้วสิ่งนี้สามารถแทรกเข้าไปในฟังก์ชันที่ทำงานเหมือนกับ jitter

กึ่งสุ่มสุ่มและกล่องขนาดใหญ่

library("fOptions")

 hjit <- runif.halton(dim(running.df)[1],2) 
 xjit <- (hjit[,1]-.5)*0.8
 yjit <- (hjit[,2]-.5)*0.8  

 plot(I(often+yjit)~I(importance+xjit),data=running.df,bty="n",
    ylim=c(0.5,5.5),xlim=c(0.5,5.5),cex=0.5,pty="s",xaxt="n",yaxt="n") 
 axis(1,tick=TRUE,col=0)
 axis(2,tick=TRUE,col=0)
 rect(rep(seq(0.55,4.55,1),5),rep(seq(0.55,4.55,1),each=5),
       rep(seq(1.45,5.45,1),5),rep(seq(1.45,5.45,1),each=5),
       border=8)

1
ฉันชอบสิ่งนี้สำหรับฉันการแยกเน้นความสำคัญของธรรมชาติของข้อมูล! โชคไม่ดีที่ดวงตาของมนุษย์นั้นถูกวาดขึ้นตามธรรมชาติในรูปแบบที่ชัดเจนในการสั่นสะเทือนเช่น "แนวโน้มสูงขึ้น" ในแผงควบคุม (4,5) และ (5,3) ในด้านบวก "การนับคะแนน" ให้ความรู้สึกเป็นธรรมชาติกับฉันมากกว่าการพิจารณาความถี่ตามขนาดจุด มีการแปรผันของจุดที่เว้นระยะเท่ากันหรือรวมตัวกันในรูปแบบปกติที่กึ่งกลางเพื่อหลีกเลี่ยง "แนวโน้มความกระวนกระวายใจ" หรือไม่?
Silverfish

1
@Silverfish แนวคิดที่คล้ายคลึงกันในภูมิศาสตร์คือแผนที่ความหนาแน่นแบบจุด นักภูมิศาสตร์พบหลักฐานบางอย่างที่ว่ารูปแบบหรือรูปแบบปกติที่เติมช่องว่างจำนวนหนึ่ง (เช่นเว้นระยะห่างกันมากขึ้นจากนั้นสุ่ม) มีแนวโน้มที่จะสร้างการรับรู้ที่แม่นยำมากขึ้นในหมู่ผู้สังเกตการณ์
Andy W

IMO นี่เป็นความคิดที่ดี แต่ระยะห่างระหว่างพาเนลมีขนาดใหญ่มากในตัวอย่างนี้มันทำให้การมองเห็นแนวโน้มใด ๆ ยากมาก การรักษานั้นเลวร้ายยิ่งกว่าโรค (แต่ควรง่ายที่จะทำให้แผงใกล้กันมากขึ้น)
Andy W

1
@silverfish กึ่ง jittering สุ่มจะเป็นทางออกที่เป็นไปได้ที่ ความกังวลของคุณคือสิ่งที่ฉันมี
Glen_b

1
ดีมาก! IMO นี่เป็นตัวเลือกที่ดีกว่า spineplot ในกรณีนี้ (กระดูกสันหลังหรือโมเสกแปลงดีกว่าในการประเมินการแจกแจงแบบมีเงื่อนไขสำหรับคู่หมวดหมู่ใด ๆ - พล็อตจุด jittered นี้ง่ายต่อการประเมินแนวโน้ม - การใช้ประโยชน์จากธรรมชาติอันดับของข้อมูล ประเภทของความสัมพันธ์แบบโมโนโทนิก)
Andy W

7

การใช้แพล็ตฟอร์มแพคเกจ R:

  data$importance <- factor(data$importance, 
                            labels = c("not at all important",
                                       "somewhat unimportant",
                                       "neither important nor unimportant",
                                       "somewhat important",
                                       "very important"))
  data$often <- factor(data$often, 
                       labels = c("never",
                                  "less than once per fortnight",
                                  "once every one or two weeks",
                                  "two or three times per week",
                                  "four or more times per week"))

  makeRivPlot <- function(data, var1, var2, ...) {

    require(plyr)
    require(riverplot)
    require(RColorBrewer)

    names1 <- levels(data[, var1])
    names2 <- levels(data[, var2])

    var1 <- as.numeric(data[, var1])
    var2 <- as.numeric(data[, var2])

    edges <- data.frame(var1, var2 + max(var1, na.rm = T))
    edges <- count(edges)

    colnames(edges) <- c("N1", "N2", "Value")

    nodes <- data.frame(ID     = c(1:(max(var1, na.rm = T) +
                                      max(var2, na.rm = T))),
                        x      = c(rep(1, times = max(var1, na.rm = T)),
                                   rep(2, times = max(var2, na.rm = T))),
                        labels = c(names1, names2) ,
                        col    = c(brewer.pal(max(var1, na.rm = T), "Set1"),
                                   brewer.pal(max(var2, na.rm = T), "Set1")),
                        stringsAsFactors = FALSE)

    nodes$col <- paste(nodes$col, 95, sep = "")

    return(makeRiver(nodes, edges))

  }

a <- makeRivPlot(data, "importance", "often")

riverplot(a, srt = 45)

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


1
(+1) ฉันชอบความคิดในการใช้พิกัดแบบขนานสำหรับสิ่งนี้! ฉันคิดว่ามันจะง่ายกว่าในการติดตามเส้นทางผ่านไดอะแกรมและดูว่าคำตอบ "บ่อยครั้ง" นั้นถูกย่อยสลายอย่างไรถ้าสีไหลจากซ้ายไปขวา ความสำคัญ "เป็นตัวแปรอธิบาย) ในการใช้งานแบบอินเทอร์แอคทีฟของแปลงดังกล่าวคุณสามารถคลิกแกนเพื่อเปลี่ยนสีตามตัวแปรนั้นซึ่งมีประโยชน์
Silverfish

1
สำหรับการเปรียบเทียบการสร้างภาพข้อมูลชุด "ชุดคู่ขนาน" ของ Robert Kosaraซึ่งออกแบบมาสำหรับข้อมูลเชิงหมวดหมู่นั้นมีสีที่ไหลผ่านแผนภาพ
Silverfish

6

ความคิดที่แตกต่างกันที่ฉันไม่คิดว่าของเดิมเป็นพล็อตตะแกรง

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

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

ฉันคิดว่าฉันต้องการมันถ้าสีแสดงขนาดไม่ใช่แค่เครื่องหมายของส่วนที่เหลือ นี่เป็นเรื่องจริงโดยเฉพาะอย่างยิ่งสำหรับกรณีขอบที่คาดหวังและสังเกตความถี่จะคล้ายกันและที่เหลืออยู่ใกล้กับศูนย์; รูปแบบสีแดง / น้ำเงินแบบแบ่งขั้วนั้นดูเหมือนจะเน้นไปที่การเบี่ยงเบนเล็กน้อย

การใช้งานใน R:

library(vcd)
runningcounts.df <- as.data.frame(table(importance, often))
sieve(Freq ~ often + importance, data=runningcounts.df, shade= TRUE)

1
เกี่ยวกับการตั้งค่าของคุณว่าสีเป็นตัวแทนของขนาดและสัญญาณความเป็นไปได้อย่างหนึ่งคือการทำให้สีเทาขึ้นเมื่อความแตกต่างจากที่คาดไว้มีขนาดค่อนข้างเล็ก
Glen_b

6

แผนภูมิแท่งแบบเหลี่ยมในอาร์มันแสดงการกระจายตัวของ "มักจะ" ในแต่ละระดับของ "ความสำคัญ" อย่างชัดเจน แต่มันจะไม่ทำงานได้ดีนักถ้าจำนวนการนับสูงสุดมีความหลากหลายมากขึ้นระหว่างระดับของ "ความสำคัญ"; มันง่ายพอที่จะตั้งscales="free_y"ใน ggplot ( ดูที่นี่ ) เพื่อหลีกเลี่ยงพื้นที่ว่างมากมาย แต่รูปร่างของการกระจายจะยากที่จะมองเห็นในระดับ "ความถี่ต่ำ" ที่มีความสำคัญเนื่องจากแถบจะเล็กมาก บางทีในสถานการณ์เหล่านั้นควรใช้ความถี่สัมพัทธ์ (ความน่าจะเป็นแบบมีเงื่อนไข) บนแกนตั้งแทน

แผนภูมิแท่งแบบเหลี่ยมมุม

มันไม่ "สะอาด" เหมือนแท็บเล็ตใน Stataที่ Nick Cox เชื่อมโยง แต่ให้สื่อข้อมูลที่คล้ายกัน

รหัส R:

library(ggplot)
running2.df <- data.frame(often = factor(often, labels = c("never", "less than once per fortnight", "once every one or two weeks", "two or three times per week", "four or more times per week")), importance = factor(importance, labels = c("not at all important", "somewhat unimportant", "neither important nor unimportant", "somewhat important", "very important")))
ggplot(running2.df, aes(often)) + geom_bar() +
  facet_wrap(~ importance, ncol = 1) +
  theme(axis.text.x=element_text(angle = -45, hjust = 0)) +
  theme(axis.title.x = element_blank())
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.