เป็นวิธีที่ดีในการใช้ R เพื่อสร้าง scatterplot ที่แยกข้อมูลโดยการรักษาคืออะไร?


30

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

ฉันมีเวกเตอร์ของการสังเกตสองสามอันและฉันต้องการทำ scatterplot กับพวกเขาและแต่ละคู่ตกอยู่ในหนึ่งในสามประเภท ฉันต้องการสร้าง scatterplot ที่แยกแต่ละหมวดหมู่ตามสีหรือตามสัญลักษณ์ ฉันคิดว่าสิ่งนี้จะดีกว่าการสร้างแผนการกระจายที่แตกต่างกันสามแบบ

ฉันมีปัญหาอีกอันหนึ่งกับความจริงที่ว่าในแต่ละหมวดหมู่มีกลุ่มขนาดใหญ่ ณ จุดหนึ่ง แต่กลุ่มนั้นมีขนาดใหญ่กว่ากลุ่มหนึ่งมากกว่าอีกสองกลุ่ม

ไม่มีใครรู้วิธีที่ดีในการทำเช่นนี้? แพ็คเกจที่ฉันควรติดตั้งและเรียนรู้วิธีการใช้งาน? ใครทำอะไรที่คล้ายกัน?

ขอบคุณ

คำตอบ:


53

กลุ่มที่มีขนาดใหญ่ : หากการพิมพ์ทับเป็นปัญหาคุณสามารถใช้อัลฟาที่ต่ำกว่าได้ดังนั้นจุดเดียวจะสลัว แต่การทำ overprining จะทำให้สีเข้มขึ้น หรือคุณเปลี่ยนเป็นฮิสโทแกรมหรือการประมาณความหนาแน่น 2d

require ("ggplot2")
  • ggplot (iris, aes (x = Sepal.Length, y = Sepal.Width, colour = Species)) + stat_density2d ()
    ความหนาแน่น
    คุณอาจต้องการเผชิญกับสิ่งนี้ ...

  • ggplot (iris, aes (x = Sepal.Length, y = Sepal.Width, fill = Species)) + stat_binhex (bins=5, aes (alpha = ..count..)) + facet_grid (. ~ Species)
    hexbin
    ในขณะที่คุณสามารถนำพล็อตนี้ไปได้โดยไม่ต้องมีเฟซเซ็ตลำดับสปีชี่ของสปีชี่จะเพิ่มพลังให้กับภาพสุดท้าย

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

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

    ggplot (df, aes (x = date, y = t5)) + 
      stat_binhex (data = df [df$t5 <= 0.5,], bins = nrow (df) / 250) +
          geom_point (data = df [df$t5 > 0.5,], aes (col = type), shape = 3) +
      scale_fill_gradient (low = "#AAAAFF", high = "#000080") +
      scale_colour_manual ("response type", 
        values = c (normal = "black", timeout = "red")) + 
      ylab ("t / s")
    

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


เพื่อความสมบูรณ์ของแพ็คเกจการวางแผนฉันขอพูดถึงlattice:

require ("lattice")
  • xyplot(Sepal.Width ~ Sepal.Length | Species, iris, pch= 20)
    <code> xyplot (Sepal.Width ~ Sepal.Length | Species, iris, pch = 20) </code>

  • xyplot(Sepal.Width ~ Sepal.Length, iris, groups = iris$Species, pch= 20)
    <code> xyplot (Sepal.Width ~ Sepal.Length, iris, groups = iris $ Species, pch = 20) </code>

  • xyplot(Sepal.Width ~ Sepal.Length | Species, iris, groups = iris$Species, pch= 20)
    <code> xyplot (Sepal.Width ~ Sepal.Length | สปีชี่, ม่านตา, กลุ่ม = ม่านตา $ Species, pch = 20) </code>


น่ารัก! ขอบคุณมากถังขยะฐานสิบหกทำเคล็ดลับได้อย่างสมบูรณ์แบบ!
CRF

22

นี่เป็นหนึ่งในปัญหาคลาสสิกสำหรับชุดข้อมูล 'Iris' นี่คือลิงก์ไปยังชุดการวางแผนโครงการทั้งหมดโดยยึดตามชุดข้อมูลที่มีรหัส R ซึ่งคุณอาจปรับตัวเข้ากับปัญหาของคุณได้

นี่คือวิธีการที่ใช้กับ base R แทนแพ็คเกจเสริม

plot(iris$Petal.Length, iris$Petal.Width, pch=21, 
     bg=c("red","green3","blue")[unclass(iris$Species)], 
     main="Edgar Anderson's Iris Data")

ซึ่งผลิตรูปนี้:

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

จากตรงนั้นขึ้นอยู่กับเนื้อเรื่องของคุณคุณสามารถเริ่มยุ่งกับระดับอัลฟ่า / ความโปร่งใสเพื่อให้มีการ overplotting เป็นต้น แต่ฉันจะสร้างขึ้นจากกราฟพื้นฐานมากก่อน

ในขณะที่มีเหตุผลหลายประการที่จะยึดติดกับฐาน R, แพ็คเกจอื่น ๆ ทำให้การวางแผนง่าย แยกออกจากข้อมูลโดยลักษณะเด่นเป็นหนึ่งในจุดแข็งของggplot2และตาข่ายแพคเกจ ggplot2 สร้างแผนการที่ดึงดูดสายตาโดยเฉพาะ แพคเกจทั้งสองแสดงให้เห็นในคำตอบโดย @cbeleites


4
สับสนเล็กน้อยเพราะถึงแม้ว่าคุณจะแนะนำ ggplot2 คุณไม่ได้ใช้ในตัวอย่าง woudl เทียบเท่า ggplot2 เป็นไลบรารี (ggplot2); qplot (Petal.Length, Petal.Width, color = Species, data = iris, main = "ข้อมูล Iris ของ Edgar Anderson") สิ่งนี้ยังมีข้อได้เปรียบของการสร้างตำนานโดยอัตโนมัติ
Peter Ellis

@PeterEllis นั่นเป็นเพราะในขณะที่ฉันสามารถรับรู้บางสิ่งบางอย่างที่ให้ยืมตัวเองได้ดีกับ ggplot2 แต่ฉันก็สามารถผ่านกราฟิกพื้นฐานได้
Fomite

1
กลลวงที่ยอดเยี่ยมกับ unclass () ในกราฟิกพื้นฐาน BTW
Peter Ellis

16

หรือด้วย ggplot2:

ggplot(iris, aes(x = Sepal.Length, y = Sepal.Width, colour = Species)) + geom_point()
ggplot(iris, aes(x = Sepal.Length, y = Sepal.Width)) + geom_point() + facet_grid(~Species)

ซึ่งผลิตผล

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

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

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