Как создать матрицу тепловых карт в R с сохранением структуры матрицы? - PullRequest
0 голосов
/ 23 мая 2019

Я хочу создать матрицу тепловой карты корреляции.Я следовал этому уроку .Вот код:

mydata <- mtcars[, c(1,3,4,5,6,7)]

cormat <- round(cor(mydata),2)

# Get upper triangle of the correlation matrix
get_lower_tri <- function(cormat){
  cormat[upper.tri(cormat)]<- NA
  return(cormat)
}

lower_tri <- get_lower_tri(cormat)

library(reshape2)
melted_cormat <- melt(lower_tri, na.rm = TRUE)

# Heatmap
library(ggplot2)
ggplot(data = melted_cormat, aes(Var2, Var1, fill = value))+
  geom_tile(color = "white")+
  scale_fill_gradient2(low = "blue", high = "red", mid = "white", 
                       midpoint = 0, limit = c(-1,1), space = "Lab", 
                       name="Pearson\nCorrelation") +
  theme_minimal()+ 
  theme(axis.text.x = element_text(angle = 45, vjust = 1, 
                                   size = 12, hjust = 1))+
  coord_fixed()

Проблема в том, что ggplot меняет порядок строк.Фактически, вот нижний треугольник матрицы:

> lower_tri
       mpg  disp    hp  drat    wt qsec
mpg   1.00    NA    NA    NA    NA   NA
disp -0.85  1.00    NA    NA    NA   NA
hp   -0.78  0.79  1.00    NA    NA   NA
drat  0.68 -0.71 -0.45  1.00    NA   NA
wt   -0.87  0.89  0.66 -0.71  1.00   NA
qsec  0.42 -0.43 -0.71  0.09 -0.17    1

Например, первая строка mpg, но первая строка тепловой карты qsec: enter image description here

Я хочу получить структуру тепловой карты, точно похожую на матрицу lower_tri, т.е. желаемый график выглядит примерно так: enter image description here

Но я не мог получить это.

1 Ответ

0 голосов
/ 23 мая 2019

На представленном изображении ось Var1 движется в правильном направлении в соответствии с соглашением (1 внизу, 6 вверху). Это просто не выглядит правильно в контексте этой матрицы.

Существует простое решение: вы просто меняете уровни факторов в столбце Var1 в melted_cormat

ggplot(
    data = melted_cormat,
    aes(Var2, forcats::fct_rev(Var1), fill = value)
  ) +
  geom_tile(color = "white") +
  scale_fill_gradient2(
    low = "blue", high = "red", mid = "white", midpoint = 0,
    limit = c(-1,1), space = "Lab", name="Pearson\nCorrelation"
  ) +
  theme_minimal() + 
  theme(
    axis.text.x = element_text(
      angle = 45, vjust = 1, size = 12, hjust = 1)
  ) +
  coord_fixed()

[Я надеялся, что scale_y_reverse может это исправить, но это не помогает по причинам]

...