代码之家  ›  专栏  ›  技术社区  ›  Nick Criswell

相关矩阵-tidyr聚集v.重塑2熔体

  •  6
  • Nick Criswell  · 技术社区  · 6 年前

    我想使用 ggplot2 使上三角相关矩阵类似 this one . 我可以很好地复制它,但出于某种原因,我一直想转换 reshape2 功能到 tidyr 一个。我想我可以用 gather 代替 melt ,但这不起作用。

    原始结果使用 重塑2

    library(reshape2)
    library(ggplot2)
    mydata <- mtcars[, c(1,3,4,5,6,7)]
    cormat <- round(cor(mydata),2)
    library(reshape2)
    melted_cormat <- melt(cormat)
    
    # Get upper triangle of the correlation matrix
    get_upper_tri <- function(cormat){
        cormat[lower.tri(cormat)]<- NA
        return(cormat)
    }
    
    upper_tri <- get_upper_tri(cormat)
    
    melted_cormat <- melt(upper_tri, na.rm = TRUE)
    
    ggplot(data = melted_cormat, aes(Var2, Var1, fill = value)) + 
        geom_tile()
    

    enter image description here

    我尝试使用 聚集 从…起 三年 .

    library(tidyverse)
    
    
    #first correlatoin matrix
    cor_base <- round(cor(mydata), 2)
    #now UT
    cor_base[lower.tri(cor_base)] <- NA
    cor_tri <- as.data.frame(cor_base) %>% 
        rownames_to_column("Var2") %>% 
        gather(key = Var1, value = value, -Var2, na.rm = TRUE) %>% 
        as.data.frame()
    
    ggplot(data = cor_tri, aes(x = Var2, y = Var1, fill = value)) + 
        geom_tile()
    

    enter image description here

    这些值都是相同的,但顺序发生了一些变化,这使得这看起来是错误的。检查 identical 不返回 TRUE 但这两个数据帧的值似乎是相同的。。。

    > identical(cor_tri, melted_cormat)
    [1] FALSE
    > dim(cor_tri)
    [1] 21  3
    > dim(melted_cormat)
    [1] 21  3
    > sum(cor_tri == melted_cormat)
    [1] 63
    

    对此有什么想法吗?还是我应该继续加载 重塑2 为了实现我的目标?

    谢谢

    1 回复  |  直到 4 年前
        1
  •  11
  •   Parfait    6 年前

    本质上,这是 factor character 类型 Var1 Var2 在Reformae2和tidyr版本之间。前者的 melt() 保留相关矩阵的因子和顺序: "mpg", "disp", "hp", "drat", "wt", "qsec" 和后者的 tibble:rownames_to_colums() 按字母顺序创建字符类型: "disp", "drat", "hp", "mpg", "qsec", "wt" . 如图所示,两者都有不同的影响绘图渲染的级别。

    要解决此问题,请考虑 dplyr::mutate 线路使用 base::factor(rownames(.), ... )并明确将标高定义为cor_base的原始排列 row.names() . 此外,您的 Var1 Var2 已反转。

    cor_base <- round(cor(mydata), 2)
    cor_base[lower.tri(cor_base)] <- NA
    
    cor_tri <- as.data.frame(cor_base) %>% 
      mutate(Var1 = factor(row.names(.), levels=row.names(.))) %>% 
      gather(key = Var2, value = value, -Var1, na.rm = TRUE, factor_key = TRUE) 
    
    ggplot(data = cor_tri, aes(Var2, Var1, fill = value)) + 
      geom_tile()
    

    Cor Matrix Plot Output


    此外,对于您或未来的读者,这里是 base::reshape 解决上述因素水平问题的版本:

    cor_base <- round(cor(mydata), 2)
    cor_base[lower.tri(cor_base)] <- NA
    
    cor_base_df <- transform(as.data.frame(cor_base),
                             Var1 = factor(row.names(cor_base), levels=row.names(cor_base)))
    
    cor_long <- subset(reshape(cor_base_df, idvar=c("Var1"), 
                               varying = c(1:(ncol(cor_base_df)-1)), v.names="value",
                               timevar = "Var2", 
                               times = factor(row.names(cor_base), levels=row.names(cor_base)),
                               new.row.names = 1:100,
                               direction = "long"), !is.na(value))
    
    ggplot(data = cor_long, aes(Var2, Var1, fill = value)) + 
      geom_tile()