Побудуйте матрицю кореляції у графік


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
Дякую за відповідь. Багато людей звикли до кореляційних графіків, в яких діагональ, що містить 1-х, проходить зліва вліво до правого нижнього квадрата (див. Приклад рисунку у питанні), а не від нижнього лівого до верхнього правого квадрата, як у вашому рішення. Ось як вирішити цю проблему: cor_reversed <- застосувати (cor, 2, rev); levelplot (t (cor_reversed), ...)
пропустіть

@ bill_080 чому копіювання коду не надрукує матрицю кореляції?
Павлос Пантеліадіс

59

Швидше виглядає "менше", але варто перевірити (як надати більше візуальної інформації):

Кореляційні матричні еліпси : Кореляційна матриця еліпсів Кореляційні матричні кола : Кореляційні матричні кола

Будь-ласка, знайдіть більше прикладів у віньєті корпоративу, на яку посилається @assylias нижче.


1
Здається, сайт не працює. Чи є у вас код або опис пакету для першого сюжету?
яскрава зірка

1
@TrevorAlexander: Наскільки я пам’ятаю, перший сюжет створив ellipse:plotcorr.
daroczig

Я посилав редагування для посилання 1 на сторінку: poboljša- visualisation.org/vis/id= 250, яка забезпечує те саме зображення.
russellpierce

1
Дякую @rpierce, хоча я бачу лише зображення там без джерела R. Що мені тут не вистачає?
daroczig


43

Дуже просто з гратами :: 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

Для того, щоб діагональ 1 рухалася зверху ліворуч вниз знизу праворуч, необхідний зворот факторних рівнів для X1використання:z.m$X1 <- factor(z.m$X1, levels = rev(levels( z.m$X1 )))
arun

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

Я думаю, ви праві, що теплова карта не обов’язково є найдавнішою її назвою. У Вікіпедії є перелік статей 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 як невимушений ...

Діаграма розсіювання еліпса дійсно є з пакету еліпса і генерується за допомогою:

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.