单相关热图在" R"具有两个不同的相关矩阵但相同的行名称

时间:2016-12-27 05:30:22

标签: r

我试图在" R中使用两个不同的相关矩阵进行相关热图。下三角应对应不同的矩阵和上三角形。假设我有100个基因,我做了微阵列和转录组。现在我想在一个热图中绘制两个三角形。 提前完成。

1 个答案:

答案 0 :(得分:1)

您可以通过首先创建一个相关矩阵来组合您想要使用的两个不同三角形,然后从组合相关矩阵中绘制热图来实现此目的。

首先,我将生成两个随机数据数据集,因此我们将有两个相关矩阵进行组合。

set.seed(24601)
# generate random data for first correlation matrix
m <- matrix(runif(25, min = -1, max = 1), ncol = 5)
cov1 <- m %*% t(m) # make it symmetrical and positive definite
df1 <- mnormt::rmnorm(n = 100, varcov = cov1, sqrt=NULL)  
colnames(df1) <- paste("X", 1:5, sep = "_")
# generate random data for second correlation matrix
m <- matrix(runif(25, min = -1, max = 1), ncol = 5)
cov2 <- m %*% t(m) 
df2 <- mnormt::rmnorm(n = 100, varcov = cov2, sqrt=NULL) 
colnames(df2) <- paste("X", 1:5, sep = "_")

获取两个相关矩阵:

cor1 <- cor(df1)  
cor2 <- cor(df2)   

将一个相关矩阵的上三角形与另一个相关矩阵的下三角相结合:

cor_combined <- cor1
cor_combined[upper.tri(cor_combined)] <- cor2[upper.tri(cor2)]
diag(cor_combined) <- NA # remove diagonal for better plotting (optional)

绘制热图,使用ggplot2显示在此处。由于ggplot()通常最适合长格式数据,因此我使用gather重新格式化数据---用于绘图的数据框的前六行显示在head()命令之后

cor_df <- as.data.frame(cor_combined) %>% 
  dplyr::mutate(var1 = row.names(.)) %>% 
  tidyr::gather("var2", "value", -var1) 

> head(cor_df)
  var1 var2       value
1  X_1  X_1          NA
2  X_2  X_1 -0.62115508
3  X_3  X_1  0.65660075
4  X_4  X_1 -0.24248121
5  X_5  X_1 -0.67412086
6  X_1  X_2 -0.01013485

ggplot(cor_df, aes(var1, var2)) + 
  geom_tile(aes(fill = value), colour = "white") + 
  scale_fill_gradient(low = "darkred", high = "navy") + 
  scale_x_discrete(expand = c(0, 0)) + 
  scale_y_discrete(expand = c(0, 0)) + 
  labs(x=NULL, y=NULL) + 
  theme(legend.position = "none", 
        axis.ticks = element_blank(), 
        axis.text.x = element_text(angle = 60, hjust = 1))

heatmap from two different correlation matrices