将相关矩阵绘制成图


Answers:


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 <-apply(cor,2,rev); levelplot(t(cor_reversed),...)
跳过

@ bill_080为什么复制粘贴您的代码不会打印相关矩阵?
Pavlos Panteliadis

59

看起来更“少”,但是值得检查(因为提供了更多的可视信息):

相关矩阵椭圆相关矩阵椭圆 相关矩阵圆相关矩阵圆

请在下面@assylias引用的corrplot小插图中找到更多示例。


1
该网站似乎已失效。您对第一幅图有任何代码或包装说明吗?
明亮的明星

1
@TrevorAlexander:据我所知,第一个情节是由创建的ellipse:plotcorr
daroczig 2014年

我已经将链接1的编辑提交到:Improvement-visualisation.org/vis/id=250,它提供了相同的图像。
russellpierce 2014年

1
谢谢@rpierce,尽管我只看到没有R源的图像。我在这里想念什么?
daroczig 2014年


43

非常容易使用grid :: levelplot:

z <- cor(mtcars)
require(lattice)
levelplot(z)

在此处输入图片说明


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 2011年

@Daroczig-好点。看起来scale_fill_gradient2()可以实现您自动描述的功能。我不知道那个存在。
大通

1
添加到此:p <- ggplot(.....) + ... + ....; library(plotly); ggplotly(p)将使其互动
schlusie

为了使对角1层的由左到右下顶去,需要因子水平的逆转X1使用:z.m$X1 <- factor(z.m$X1, levels = rev(levels( z.m$X1 )))
阿伦

11

使用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 : //flowingdata.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 2011年

我认为您是对的,热图不一定是最早的名称。维基百科列出了一份1957年的论文,但是我检查了一下,“热图”一词在其中没有出现(图形看起来也不像当前形式)。
Ari B. Friedman

5

我一直在进行类似于@daroczig发布的可视化的工作,并使用软件包的plotcorr()功能使用@Ulrik发布的代码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))

对plotcor()函数的调用结果


3

我意识到已经有一段时间了,但是新读者可能会对软件包(https://cran.rstudio.com/web/packages/corrr/index.html)感兴趣,rplot()corrr软件包可以生成各种@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)

在此处输入图片说明



1

我最近了解到的另一个解决方案是使用qtlcharts包创建的交互式热图。

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

下面是结果图的静态图像。 在此处输入图片说明

您可以在我的博客上看到交互式版本。将鼠标悬停在热图上可以查看行,列和单元格的值。单击一个单元格以查看散点图,该散点图具有按组着色的符号(在此示例中,圆柱数,4为红色,6为绿色,8为蓝色)。将鼠标悬停在散点图上的点上即可得到行的名称(在本例中为汽车的品牌)。


0

由于我无法发表评论,因此我必须给daroczig答案以2c的评分。

椭圆散点图确实来自椭圆包,并使用以下命令生成:

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程序包也可能对此处找到的漂亮图像很有用

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.