【问题标题】:Correlation Matrix - tidyr gather v. reshape2 melt相关矩阵 - tidyr 聚集 v. reshape2 融化
【发布时间】:2018-05-08 14:58:03
【问题描述】:

我想使用ggplot2 来制作像this one 这样的上三角相关矩阵。我可以很好地复制那个,但由于某种原因,我真的很想将reshape2 函数转换为tidyr 函数。我认为我可以使用gather 代替melt,但这不起作用。

使用reshape2 的原始结果

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

我尝试使用来自tidyr 的gather。

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

这些值都相同,但顺序发生了一些变化,这使得这看起来不对。检查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

对此有什么想法,还是我应该继续加载reshape2 以完成我的目标?

谢谢。

【问题讨论】:

    标签: r matrix ggplot2 tidyr reshape2


    【解决方案1】:

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

    要解决此问题,请考虑使用base::factor(rownames(.), ... 的dplyr::mutate 行,并将级别明确定义为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()
    


    另外,对于您或未来的读者,这里的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()
    

    【讨论】:

      猜你喜欢
      • 2014-12-19
      • 2015-06-08
      • 2018-08-08
      • 1970-01-01
      • 2016-10-01
      • 2014-10-30
      • 2018-01-06
      • 1970-01-01
      • 2018-06-30
      相关资源
      最近更新 更多