สร้างเมทริกซ์ของ scatterplots (เทียบเท่าคู่ ()) ใน ggplot2


117

เป็นไปได้ไหมที่จะพล็อตเมทริกซ์ของการกระจายggplot2โดยใช้ggplotคุณสมบัติที่ดีเช่นการจับคู่ปัจจัยเพิ่มเติมกับสีรูปร่าง ฯลฯ และเพิ่มความเรียบเนียนขึ้น?

ฉันคิดเกี่ยวกับบางสิ่งบางอย่างที่คล้ายกับฟังก์ชั่นbasepairs


17
ตรวจสอบ ggally ด้วย
hadley

1
อ่าฉันไม่เห็นความคิดเห็นของคุณที่นั่น hadley ฉันตอบ CW เพื่อไม่ให้ขโมย
เครดิต

คำตอบ:


37

คุณอาจต้องการลอง plotmatrix:

  library(ggplot2)
  data(mtcars)
  plotmatrix(mtcars[,1:3])

สำหรับฉัน mpg (คอลัมน์แรกใน mtcars) ไม่ควรเป็นปัจจัย ฉันไม่ได้ตรวจสอบ แต่ไม่มีเหตุผลว่าทำไมจึงควรเป็นอย่างนั้น อย่างไรก็ตามฉันได้พล็อตกระจาย :)


หมายเหตุ:สำหรับการอ้างอิงในอนาคตplotmatrix()ฟังก์ชันนี้จะถูกแทนที่ด้วยggpairs()ฟังก์ชันจากGGallyแพ็กเกจตามที่ @ naught101 แนะนำในคำตอบอื่นด้านล่างสำหรับคำถามนี้


ฉันไม่สามารถเข้าใจปัญหานี้ได้ดูเหมือนว่าจะต้องใช้ปัจจัยทางด้านขวามือของสูตร .. หรือช่วยยกตัวอย่างให้ฉันหน่อยได้ไหม
Karsten W.

1
ใครรู้วิธีเพิ่มสี ดูเหมือนว่าฉันจะไม่สามารถนำgist.github.com/1405150นี้ไปใช้งานได้
Etienne Low-Décarie

1
ส่วนแรกของคำตอบนี้ไม่ถูกต้องและทำให้เกิดความสับสน คุณไม่สามารถจับคู่พล็อตโดยใช้ faceting ได้: คุณทำได้เฉพาะพล็อต y x x และจัดกลุ่มตามปัจจัย กล่าวอีกนัยหนึ่งคือเมื่อใช้ faceting คุณจะมี x และ y เท่ากันในแต่ละ sub-plot เมื่อใช้คู่คุณมี x ต่างกันในแต่ละคอลัมน์และ y ต่างกันในแต่ละแถว
naught101

28
สำหรับการอ้างอิงในอนาคตplotmatrix()ฟังก์ชันนี้จะถูกแทนที่ด้วยggpairs()ฟังก์ชันจากGGallyแพ็กเกจตามที่ @ naught101 แนะนำในการตอบคำถามนี้
smillig

1
@MattBannert เพิ่มความคิดเห็นในโพสต์ของคุณเพื่อให้มองเห็นได้ชัดเจนขึ้นฉันสามารถเข้าใจผู้โหวตได้หากข้ามการอ่านความคิดเห็น หวังว่าคุณจะไม่รังเกียจ
zx8754

232

ฉันอยากจะทำสิ่งนี้ต่อไป แต่ plotmatrix นั้นไร้สาระ Hadley แนะนำให้ใช้แพ็คเกจ GGallyแทน มันมีฟังก์ชั่นggpairsที่เป็นคู่พล็อตที่ได้รับการปรับปรุงอย่างมากมาย (ให้คุณใช้ตัวแปรที่ไม่ต่อเนื่องในเฟรมข้อมูลของคุณ) มันลงจุดที่แตกต่างกันในแต่ละตารางขึ้นอยู่กับประเภทตัวแปร:

library(GGally)
ggpairs(iris, aes(colour = Species, alpha = 0.4))

ใส่คำอธิบายภาพที่นี่


26
นี่มันเยี่ยมจริงๆ เป็นที่น่าสังเกตว่าcolourตัวแปรใด ๆจะต้องเป็นปัจจัย ใช้เวลา 45 นาทีเพื่อหาสิ่งนั้นออกมา
gregmacfarlane

1
มีวิธีใดในการพล็อตเมทริกซ์ความสัมพันธ์เหล่านี้โดยไม่มีคู่หรือไม่ตัวอย่างเช่นฉันต้องการพล็อตคอลัมน์แรกเทียบกับคอลัมน์อื่น ๆ ทุกคอลัมน์คู่ให้คู่ที่เป็นไปได้มากเช่นฉันมี 10 คอลัมน์และให้ 10 * 10 = 100 แต่ฉัน ต้องการคอลัมน์ที่ 1 เทียบกับ 9 อื่น ๆ เท่านั้น
Rgeek

1
@Rgeek: คุณสามารถmeltใช้ dataframe โดยใช้ตัวแปรที่คุณสนใจเป็นตัวแปร id จากนั้นจึงทำการ facet โดยตัวแปรอื่น ๆ
naught101

6
อย่าใช้ ggpairs เพียงแค่ใช้ ggplot2 ตามปกติเช่นggplot(data, aes(x=id, y=value)) + geom_point() + facet_grid(.~variable). ฉันสมมติว่าคุณกำลังพูดถึงแผนการกระจายเมื่อคุณพูดว่า "พล็อตสหสัมพันธ์" เพราะฉันไม่เคยได้ยินเรื่องนี้มาก่อน
naught101

3
@JimGreen GGally::ggpairs(iris, aes(colour = Species, alpha=0.4))
ElBaulP

17

หากต้องการได้รับggplotวัตถุ (ไม่ใช่ggmatrixในกรณีของggpairs()) วิธีแก้ปัญหาคือการหลอมข้อมูลสองครั้งจากนั้นจึงทำการggplotปรับมุม facet_wrapจะดีกว่าfacet_gridในการ จำกัด พื้นที่พล็อตเนื่องจากมีการให้scales = 'free'พารามิเตอร์

require(ggplot2) 
require(dplyr)
require(tidyr)

gatherpairs <- function(data, ..., 
                        xkey = '.xkey', xvalue = '.xvalue',
                        ykey = '.ykey', yvalue = '.yvalue',
                        na.rm = FALSE, convert = FALSE, factor_key = FALSE) {
  vars <- quos(...)
  xkey <- enquo(xkey)
  xvalue <- enquo(xvalue)
  ykey <- enquo(ykey)
  yvalue <- enquo(yvalue)

  data %>% {
    cbind(gather(., key = !!xkey, value = !!xvalue, !!!vars,
                 na.rm = na.rm, convert = convert, factor_key = factor_key),
          select(., !!!vars)) 
  } %>% gather(., key = !!ykey, value = !!yvalue, !!!vars,
               na.rm = na.rm, convert = convert, factor_key = factor_key)
}

iris %>% 
  gatherpairs(Sepal.Length, Sepal.Width, Petal.Length, Petal.Width) %>% {
  ggplot(., aes(x = .xvalue, y = .yvalue, color = Species)) +
      geom_point() + 
      geom_smooth(method = 'lm') +
      facet_wrap(.xkey ~ .ykey, ncol = length(unique(.$.ykey)), scales = 'free', labeller = label_both) +
      scale_color_brewer(type = 'qual')
}

ใส่คำอธิบายภาพที่นี่

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