พล็อตเมทริกซ์สหสัมพันธ์ลงในกราฟ


93

ฉันมีเมทริกซ์ที่มีค่าความสัมพันธ์บางค่า ตอนนี้ฉันต้องการพล็อตสิ่งนั้นในกราฟที่มีลักษณะเช่นนั้นมากหรือน้อย:

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

ฉันจะบรรลุเป้าหมายนั้นได้อย่างไร?


คุณอาจพบว่าฟังก์ชันนี้น่าสนใจ: gist.github.com/low-decarie/5886616 แม้ว่าจะยังต้องปรับปรุงอยู่ก็ตาม ( stackoverflow.com/questions/17370853/… )
Etienne Low-Décarie

@anon คุณสามารถแบ่งปันรหัสนี้ได้หรือไม่? นี่คือสิ่งที่ฉันกำลังมองหาสำหรับการนำเสนอของฉัน
Pavlos Panteliadis

คำตอบ:


57

รวดเร็วสกปรกและอยู่ในสนามเบสบอล:

library(lattice)

#Build the horizontal and vertical axis information
hor <- c("214", "215", "216", "224", "211", "212", "213", "223", "226", "225")
ver <- paste("DM1-", hor, sep="")

#Build the fake correlation matrix
nrowcol <- length(ver)
cor <- matrix(runif(nrowcol*nrowcol, min=0.4), nrow=nrowcol, ncol=nrowcol, dimnames = list(hor, ver))
for (i in 1:nrowcol) cor[i,i] = 1

#Build the plot
rgb.palette <- colorRampPalette(c("blue", "yellow"), space = "rgb")
levelplot(cor, main="stage 12-14 array correlation matrix", xlab="", ylab="", col.regions=rgb.palette(120), cuts=100, at=seq(0,1,0.01))

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


2
ดูเหมือนตัวอย่างจาก OP (แบบอักษรสีเค้าโครง) ดูเหมือนต้นฉบับถูกสร้างขึ้นด้วยโครงตาข่ายด้วย คำตอบที่ละเอียดมาก +1
Marek

1
ขอบคุณสำหรับคำตอบ หลายคนคุ้นเคยกับพล็อตความสัมพันธ์ซึ่งเส้นทแยงมุมที่มี 1-s จะวิ่งจากด้านบนซ้ายไปยังสี่เหลี่ยมด้านล่างขวา (ดูรูปตัวอย่างในคำถาม) แทนที่จะเป็นจากด้านล่างซ้ายไปยังสี่เหลี่ยมด้านขวาบนเช่นเดียวกับในของคุณ วิธีการแก้. วิธีแก้ไขปัญหานี้มีดังนี้: cor_reversed <- ใช้ (cor, 2, rev); levelplot (t (cor_reversed), ... )
ข้าม

@ bill_080 ทำไมการคัดลอกวางรหัสของคุณจึงไม่พิมพ์เมทริกซ์สหสัมพันธ์
Pavlos Panteliadis

59

ดูเหมือน "น้อยกว่า" แต่ควรตรวจสอบ (เนื่องจากให้ข้อมูลที่เป็นภาพมากขึ้น):

วงรีสหสัมพันธ์เมทริกซ์ : จุดไข่ปลาเมทริกซ์สหสัมพันธ์ แวดวงความสัมพันธ์เมทริกซ์ : วงกลมเมทริกซ์สหสัมพันธ์

โปรดดูตัวอย่างเพิ่มเติมในcorrplot vignette ที่อ้างอิงโดย @assylias ด้านล่าง


1
ไซต์ดูเหมือนจะหมดอายุ คุณมีรหัสหรือคำอธิบายแพ็คเกจสำหรับพล็อตแรกหรือไม่?
bright-star

1
@TrevorAlexander: ellipse:plotcorrเท่าที่ผมจำได้ว่าพล็อตแรกที่ถูกสร้างขึ้นโดย
daroczig

ฉันได้ส่งการแก้ไขสำหรับลิงก์ 1 ไปยัง: Improve-visualisation.org/vis/id=250ซึ่งให้รูปภาพเดียวกัน
russellpierce

1
ขอบคุณ @rpierce แม้ว่าฉันจะเห็น แต่ภาพที่นั่นโดยไม่มีแหล่งที่มา R ฉันพลาดอะไรที่นี่?
daroczig



30

ไลบรารี ggplot2 สามารถจัดการกับgeom_tile()ไฟล์. ดูเหมือนว่าอาจมีการปรับขนาดใหม่ในพล็อตด้านบนเนื่องจากไม่มีความสัมพันธ์เชิงลบใด ๆ ดังนั้นให้พิจารณาข้อมูลของคุณด้วย การใช้mtcarsชุดข้อมูล:

library(ggplot2)
library(reshape)

z <- cor(mtcars)
z.m <- melt(z)

ggplot(z.m, aes(X1, X2, fill = value)) + geom_tile() + 
scale_fill_gradient(low = "blue",  high = "yellow")

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

แก้ไข :

ggplot(z.m, aes(X1, X2, fill = value)) + geom_tile() + 
scale_fill_gradient2(low = "blue",  high = "yellow")

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

อนุญาตให้ระบุสีของจุดกึ่งกลางและค่าเริ่มต้นเป็นสีขาวดังนั้นอาจเป็นการปรับที่ดีที่นี่ ตัวเลือกอื่น ๆ ที่สามารถพบได้บนเว็บไซต์ ggplot ที่นี่และที่นี่


ดี (+1)! แม้ว่าฉันจะเพิ่มมาตราส่วนแบ่งแบบแมนนวล (เช่น :) c(-1, -0.6, -0.3, 0, 0.3, 0.6, 1)ด้วย"white"ตรงกลางเพื่อให้สีสะท้อนความสมมาตรของความสัมพันธ์ได้อย่างมีประสิทธิภาพ
daroczig

@Daroczig - จุดดี ดูเหมือนว่าscale_fill_gradient2()จะบรรลุฟังก์ชันที่คุณอธิบายโดยอัตโนมัติ ฉันไม่รู้ว่ามีอยู่จริง
Chase

1
เพิ่มสิ่งนี้: p <- ggplot(.....) + ... + ....; library(plotly); ggplotly(p)จะทำให้เป็นแบบโต้ตอบ
schlusie

ในการทำให้เส้นทแยงมุม 1 เปลี่ยนจากบนซ้ายไปขวาล่างจำเป็นต้องมีการย้อนกลับของระดับปัจจัยในการX1ใช้:z.m$X1 <- factor(z.m$X1, levels = rev(levels( z.m$X1 )))
arun

12

ใช้แพ็คเกจ corrplot:

library(corrplot)
data(mtcars)
M <- cor(mtcars)
##  different color series
col1 <- colorRampPalette(c("#7F0000","red","#FF7F00","yellow","white", 
        "cyan", "#007FFF", "blue","#00007F"))
col2 <- colorRampPalette(c("#67001F", "#B2182B", "#D6604D", "#F4A582", "#FDDBC7",
        "#FFFFFF", "#D1E5F0", "#92C5DE", "#4393C3", "#2166AC", "#053061"))  
col3 <- colorRampPalette(c("red", "white", "blue")) 
col4 <- colorRampPalette(c("#7F0000","red","#FF7F00","yellow","#7FFF7F", 
        "cyan", "#007FFF", "blue","#00007F"))   
wb <- c("white","black")


par(ask = TRUE)


## different color scale and methods to display corr-matrix
corrplot(M, method="number", col="black", addcolorlabel="no")
corrplot(M, method="number")
corrplot(M)
corrplot(M, order ="AOE")
corrplot(M, order ="AOE", addCoef.col="grey")

corrplot(M, order="AOE", col=col1(20), cl.length=21,addCoef.col="grey")
corrplot(M, order="AOE", col=col1(10),addCoef.col="grey")

corrplot(M, order="AOE", col=col2(200))
corrplot(M, order="AOE", col=col2(200),addCoef.col="grey")
corrplot(M, order="AOE", col=col2(20), cl.length=21,addCoef.col="grey")
corrplot(M, order="AOE", col=col2(10),addCoef.col="grey")

corrplot(M, order="AOE", col=col3(100))
corrplot(M, order="AOE", col=col3(10))



corrplot(M, method="color", col=col1(20), cl.length=21,order = "AOE", addCoef.col="grey")

if(TRUE){

corrplot(M, method="square", col=col2(200),order = "AOE")

corrplot(M, method="ellipse", col=col1(200),order = "AOE")


corrplot(M, method="shade", col=col3(20),order = "AOE")

corrplot(M, method="pie", order = "AOE")


## col=wb
corrplot(M, col = wb, order="AOE", outline=TRUE, addcolorlabel="no")
## like Chinese wiqi, suit for either on screen or white-black print.
corrplot(M, col = wb, bg="gold2",  order="AOE", addcolorlabel="no")
}

ตัวอย่างเช่น:

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

IMO ค่อนข้างหรูหรา


9

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

การใช้กราฟิกพื้นฐาน: http://flowdata.com/2010/01/21/how-to-make-a-heatmap-a-quick-and-easy-solution/

โดยใช้ ggplot2: http://learnr.wordpress.com/2010/01/26/ggplot2-quick-heatmap-plotting/


ฉันไม่แน่ใจว่าการเรียกมันว่า 'แผนที่ความร้อน' เป็นสิ่งประดิษฐ์ที่ค่อนข้างทันสมัยหรือไม่ ดูเหมือนว่าจะสมเหตุสมผลถ้าคุณพยายามแสดง 'ฮอตสปอต' โดยใช้โทนสีแดงส้มเหลือง แต่โดยทั่วไปแล้วจะเป็นเพียงพล็อตภาพหรือพล็อตเมทริกซ์หรือพล็อตแรสเตอร์ ฉันจะสนใจที่จะค้นหาข้อมูลอ้างอิงที่เก่าแก่ที่สุดที่เรียกมันว่า 'แผนที่ความร้อน' tldr; "[ต้องการอ้างอิง]"
Spacedman

ฉันคิดว่าคุณพูดถูกที่แผนที่ความร้อนไม่จำเป็นต้องเป็นชื่อที่เก่าแก่ที่สุด Wikipedia แสดงรายการกระดาษปี 1957 แต่ฉันตรวจสอบเอกสารนั้นแล้วและคำว่า "แผนที่ความร้อน" ไม่ปรากฏอยู่ที่ใดในนั้น (และกราฟิกไม่เหมือนรูปแบบปัจจุบันทุกประการ)
Ari B. Friedman

5

ฉันได้ทำงานกับสิ่งที่คล้ายกับการสร้างภาพที่โพสต์โดย @daroczig โดยมีรหัสที่โพสต์โดย @Ulrik โดยใช้plotcorr()ฟังก์ชันของellipseแพ็คเกจ ฉันชอบการใช้จุดไข่ปลาเพื่อแสดงความสัมพันธ์และการใช้สีเพื่อแสดงความสัมพันธ์เชิงลบและเชิงบวก อย่างไรก็ตามฉันต้องการให้สีที่สะดุดตาโดดเด่นสำหรับความสัมพันธ์ที่ใกล้เคียงกับ 1 และ -1 ไม่ใช่สำหรับสีที่ใกล้เคียงกับ 0

ฉันสร้างอีกทางเลือกหนึ่งซึ่งมีจุดไข่ปลาสีขาวซ้อนอยู่บนวงกลมสี วงรีสีขาวแต่ละวงมีขนาดเพื่อให้สัดส่วนของวงกลมสีที่มองเห็นด้านหลังเท่ากับสหสัมพันธ์กำลังสอง เมื่อความสัมพันธ์ใกล้ 1 และ -1 วงรีสีขาวจะมีขนาดเล็กและสามารถมองเห็นวงกลมสีได้มาก เมื่อความสัมพันธ์ใกล้ 0 วงรีสีขาวจะมีขนาดใหญ่และมองเห็นวงกลมสีเพียงเล็กน้อย

ฟังก์ชั่น, plotcor()ที่มีอยู่ในhttps://github.com/JVAdams/jvamisc/blob/master/R/plotcor.r

ตัวอย่างของพล็อตผลลัพธ์โดยใช้mtcarsชุดข้อมูลแสดงอยู่ด้านล่าง

library(plotrix)
library(seriation)
library(MASS)
plotcor(cor(mtcars), mar=c(0.1, 4, 4, 0.1))

ผลลัพธ์ของฟังก์ชัน call to plotcor ()


3

ฉันรู้ว่ามันใช้เวลาสักพักแล้ว แต่ผู้อ่านใหม่ ๆ อาจสนใจrplot()จากcorrrแพ็คเกจ ( https://cran.rstudio.com/web/packages/corrr/index.html ) ซึ่งสามารถสร้างพล็อตประเภทต่างๆที่ @daroczig กล่าวถึง แต่ออกแบบสำหรับแนวทางท่อส่งข้อมูล:

install.packages("corrr")
library(corrr)
mtcars %>% correlate() %>% rplot()

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

mtcars %>% correlate() %>% rearrange() %>% rplot()

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

mtcars %>% correlate() %>% rearrange() %>% rplot(shape = 15)

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

mtcars %>% correlate() %>% rearrange() %>% shave() %>% rplot(shape = 15)

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

mtcars %>% correlate() %>% rearrange(absolute = FALSE) %>% rplot(shape = 15)

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


2

corrplot ()ฟังก์ชั่นจากแพคเกจ R corrplotยังสามารถใช้ในการพล็อต Correlogram

library(corrplot)  
M<-cor(mtcars) # compute correlation matrix
corrplot(M, method="circle")

บทความหลายบทความที่อธิบายวิธีการคำนวณและแสดงภาพเมทริกซ์สหสัมพันธ์ได้รับการเผยแพร่ที่นี่:


1

อีกวิธีหนึ่งที่ฉันเพิ่งเรียนรู้คือแผนที่ความร้อนแบบโต้ตอบที่สร้างขึ้นด้วยแพ็คเกจqtlcharts

install.packages("qtlcharts")
library(qtlcharts)
iplotCorr(mat=mtcars, group=mtcars$cyl, reorder=TRUE)

ด้านล่างนี้คือภาพนิ่งของพล็อตผลลัพธ์ ป้อนคำอธิบายภาพที่นี่

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


0

เนื่องจากฉันไม่สามารถแสดงความคิดเห็นได้ฉันจึงต้องให้ 2c ของฉันตอบโดย daroczig ในฐานะ anwser ...

พล็อตการกระจายวงรีมาจากแพ็คเกจวงรีและสร้างด้วย:

corr.mtcars <- cor(mtcars)
ord <- order(corr.mtcars[1,])
xc <- corr.mtcars[ord, ord]
colors <- c("#A50F15","#DE2D26","#FB6A4A","#FCAE91","#FEE5D9","white",
            "#EFF3FF","#BDD7E7","#6BAED6","#3182BD","#08519C")   
plotcorr(xc, col=colors[5*xc + 6])

(จากหน้าคน)

แพ็คเกจ corrplot อาจเป็นประโยชน์กับภาพสวย ๆ ที่พบได้ที่นี่

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