【问题标题】:How do I add significance asterisks next to my values in a correlation matrix heat map?如何在相关矩阵热图中的值旁边添加显着性星号?
【发布时间】:2019-05-15 04:36:38
【问题描述】:

我在http://www.sthda.com/english/wiki/ggplot2-quick-correlation-matrix-heatmap-r-software-and-data-visualization 网上找到了这段代码

它提供了有关如何创建相关矩阵热图的说明,并且效果很好。但是,我想知道如何在矩阵中重要的值旁边获得小星星 *。我将如何去做。非常感谢任何帮助!

mydata <- mtcars[, c(1,3,4,5,6,7)]
head(mydata)
cormat <- round(cor(mydata),2)
head(cormat)
library(reshape2)
melted_cormat <- melt(cormat)
head(melted_cormat)
library(ggplot2)
ggplot(data = melted_cormat, aes(x=Var1, y=Var2, fill=value)) + 
  geom_tile()
# Get lower triangle of the correlation matrix
  get_lower_tri<-function(cormat){
    cormat[upper.tri(cormat)] <- NA
    return(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)
# Melt the correlation matrix
library(reshape2)
melted_cormat <- melt(upper_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()
reorder_cormat <- function(cormat){
# Use correlation between variables as distance
dd <- as.dist((1-cormat)/2)
hc <- hclust(dd)
cormat <-cormat[hc$order, hc$order]
}
# Reorder the correlation matrix
cormat <- reorder_cormat(cormat)
upper_tri <- get_upper_tri(cormat)
# Melt the correlation matrix
melted_cormat <- melt(upper_tri, na.rm = TRUE)
# Create a ggheatmap
ggheatmap <- ggplot(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()+ # minimal theme
 theme(axis.text.x = element_text(angle = 45, vjust = 1, 
    size = 12, hjust = 1))+
 coord_fixed()
# Print the heatmap
print(ggheatmap)
ggheatmap + 
geom_text(aes(Var2, Var1, label = value), color = "black", size = 4) +
theme(
  axis.title.x = element_blank(),
  axis.title.y = element_blank(),
  panel.grid.major = element_blank(),
  panel.border = element_blank(),
  panel.background = element_blank(),
  axis.ticks = element_blank(),
  legend.justification = c(1, 0),
  legend.position = c(0.6, 0.7),
  legend.direction = "horizontal")+
  guides(fill = guide_colorbar(barwidth = 7, barheight = 1,
                title.position = "top", title.hjust = 0.5))

【问题讨论】:

    标签: heatmap correlation significance


    【解决方案1】:

    cor() 不显示显着性级别,您可能必须使用来自Hmisc 包的rcorr()

    这和你想要的很相似(虽然图形输出不太好)

    library(ggplot2)
    library(reshape2)
    library(Hmisc)
    library(stats)
    
    abbreviateSTR <- function(value, prefix){  # format string more concisely
      lst = c()
      for (item in value) {
        if (is.nan(item) || is.na(item)) { # if item is NaN return empty string
          lst <- c(lst, '')
          next
        }
        item <- round(item, 2) # round to two digits
        if (item == 0) { # if rounding results in 0 clarify
          item = '<.01'
        }
        item <- as.character(item)
        item <- sub("(^[0])+", "", item)    # remove leading 0: 0.05 -> .05
        item <- sub("(^-[0])+", "-", item)  # remove leading -0: -0.05 -> -.05
        lst <- c(lst, paste(prefix, item, sep = ""))
      }
      return(lst)
    }
    
    d <- mtcars
    
    cormatrix = rcorr(as.matrix(d), type='spearman')
    cordata = melt(cormatrix$r)
    cordata$labelr = abbreviateSTR(melt(cormatrix$r)$value, 'r')
    cordata$labelP = abbreviateSTR(melt(cormatrix$P)$value, 'P')
    cordata$label = paste(cordata$labelr, "\n", 
                          cordata$labelP, sep = "")
    cordata$strike = ""
    cordata$strike[cormatrix$P > 0.05] = "X"
    
    txtsize <- par('din')[2] / 2
    ggplot(cordata, aes(x=Var1, y=Var2, fill=value)) + geom_tile() + 
      theme(axis.text.x = element_text(angle=90, hjust=TRUE)) +
      xlab("") + ylab("") + 
      geom_text(label=cordata$label, size=txtsize) + 
      geom_text(label=cordata$strike, size=txtsize * 4, color="red", alpha=0.4)
    

    Source

    【讨论】:

      【解决方案2】:

      difference_p 是相关矩阵的 P_value, ax5 绘制 sns.heatmap 并返回为 ax5

      data=correlation_p
      for y in range(data.shape[0]):
          for x in range(data.shape[1]):
              if data[y,x]<0.1:
                  ax4.text(x + 0.5, y + 0.5, '-',size=48,
                       horizontalalignment='center',
                       verticalalignment='center',
                       )
      

      【讨论】:

        猜你喜欢
        • 2012-08-25
        • 1970-01-01
        • 1970-01-01
        • 2018-08-12
        • 2021-05-24
        • 2020-09-23
        • 2020-06-30
        • 2015-11-20
        • 1970-01-01
        相关资源
        最近更新 更多