Постройте корреляционную матрицу в виде графика


93

У меня есть матрица с некоторыми значениями корреляции. Теперь я хочу изобразить это на графике, который выглядит примерно так:

введите описание изображения здесь

Как я могу этого добиться?


Эта функция может показаться вам интересной: gist.github.com/low-decarie/5886616, хотя ее все еще нужно улучшить ( stackoverflow.com/questions/17370853/… )
Этьен Лоу-Декари

@anon можешь поделиться кодом для этого? это именно то, что я ищу для своей презентации
Павлос Пантелиадис

Ответы:


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.
Марек

1
Спасибо за ответ. Многие люди привыкли к графикам корреляции, в которых диагональ, содержащая единицы, проходит от верхнего левого угла к нижнему правому квадрату (см. Примерный рисунок в вопросе), а не от нижнего левого угла к верхнему правому квадрату, как в вашем решение. Вот как исправить эту проблему: cor_reversed <- apply (cor, 2, rev); levelplot (t (cor_reversed), ...)
пропустить

@ bill_080, почему при копировании кода не выводится корреляционная матрица?
Павлос Пантелиадис

59

Скорее «меньше» выглядит, но стоит проверить (как дает больше наглядной информации):

Корреляционная матрица эллипсы : Эллипсы корреляционной матрицы Корреляция матричные круги : Кружки корреляционной матрицы

Дополнительные примеры можно найти в виньетке коррплота, на которую ссылается @assylias ниже.


1
Сайт вроде не функционирует. У вас есть код или описание пакета для первого сюжета?
яркая звезда

1
@TrevorAlexander: Насколько я помню, первый сюжет создал ellipse:plotcorr.
daroczig

Я отправил редактирование ссылки 1 на: Improve-visualisation.org/vis/id=250, которая предоставляет то же изображение.
russellpierce

1
Спасибо @rpierce, хотя я вижу там только изображение без источника R. Что мне здесь не хватает?
daroczig


43

Очень просто с lattice :: 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

@Daroczig - Хорошее замечание. Похоже, scale_fill_gradient2()обеспечивает автоматически описанную вами функциональность. Я не знал, что это существует.
Чейз

1
добавив к этому: p <- ggplot(.....) + ... + ....; library(plotly); ggplotly(p)сделает его интерактивным
schlusie

Чтобы диагональные X1z.m$X1 <- factor(z.m$X1, levels = rev(levels( z.m$X1 )))
единицы

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")
}

Например:

введите описание изображения здесь

Довольно элегантный ИМО


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

Думаю, вы правы в том, что тепловая карта не обязательно является самым ранним ее названием. В Википедии есть статья 1957 года, но я проверил ее, и термин «тепловая карта» нигде в ней не встречается (и графика не выглядит точно так, как в текущей форме).
Ари Б. Фридман,

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))

результат вызова функции 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 () функция из corrplot пакета R также может быть использована для построения коррелограммы.

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 - синий). При наведении указателя мыши на точки на диаграмме рассеяния отображается имя ряда (в данном случае марка автомобиля).


0

Поскольку я не могу комментировать, я должен дать свой 2c на ответ daroczig как anwser ...

График рассеяния эллипса действительно взят из пакета ellipse и создан с помощью:

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 также может - как предлагается - быть полезен с красивыми изображениями, найденными здесь

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.