如何在保留矩阵结构的情况下在R中创建热图矩阵?

时间:2019-05-23 12:38:46

标签: r matrix ggplot2 heatmap melt

我想创建一个相关热图矩阵。我关注了this tutorial。这是代码:

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,但热图的第一行是qsecenter image description here

我想获得与lower_tri矩阵完全相似的热图结构,即所需的图是这样的: enter image description here

但是我不明白。

1 个答案:

答案 0 :(得分:0)

在显示的图像中,按照惯例,Var1轴沿正确的方向移动(底部为1,顶部为6)。只是在此矩阵的上下文中看起来不正确。

不过有一个简单的解决方法:您只需反转melted_cormat的Var1列中的因子水平即可

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可以解决此问题,但因某些原因而失败]