如何分别为不同的列创建热图?
Posted
技术标签:
【中文标题】如何分别为不同的列创建热图?【英文标题】:How create a heatmap for different columns separately? 【发布时间】:2021-11-17 17:27:41 【问题描述】:我有一个显示组和 3 个数字变量的数据集。我想创建一个图,分别显示每一列的热图(单元格内的+值)。左/右轴标签应该是变量组的值,而上/下应该是变量名。 我发现了与我正在寻找的 here 类似的东西,但它是按行而不是按列的。
df<-structure(list(group = c("1", "2", "3", "4", "5", "6", "7"),
mean_eur = c(-129.567230632235, -22.2194324821243, 1342.96054365896,
-902.330543160851, -1489.68836579957, 927.850034173604, 0.0678674942780786
), mean_eur_abs = c(723.928762243989, 3769.9065702668, 6117.92527832234,
4047.2805615705, 6057.02130927563, 4124.27784143031, 5717.03080420487
), nr_obs = c(1123, 12.7372802960222, 16.3672687465791, 15.9754010695187,
16.4488279016581, 16.0794132524026, 13.343143812709)), row.names = c(NA,
-7L), class = c("tbl_df", "tbl", "data.frame"))
【问题讨论】:
【参考方案1】:不知道我理解的好不好,大概是这样的:
library(RColorBrewer)
library(ggplot2)
myPalette <- colorRampPalette(rev(brewer.pal(11, "Spectral")), space="Lab")
m <- reshape2::melt(df)
ggplot(data =m, aes(
x = variable,
y = group,
fill = value
)) +
geom_tile() +
theme_minimal() +
scale_fill_gradientn(colours = myPalette(100)) +
theme(axis.text.x = element_text(angle = 90),
text = element_text(size=16))+
theme_minimal(base_family = "serif")
或 3 个不同的图表按列排列:
graph <- list()
for (i in 1:3)
sub <- m[m$variable==colnames(df)[i+1],]
graph[[i]] <- ggplot(data =sub, aes(
x = variable,
y = group,
fill = value
)) +
geom_tile() +
theme_minimal() +
scale_fill_gradientn(colours = myPalette(100)) +
theme(axis.text.x = element_text(angle = 90),
text = element_text(size=16))+
theme_minimal(base_family = "serif")
library(gridExtra)
grid.arrange(graph[[1]],graph[[2]],graph[[3]],ncol=3)
【讨论】:
谢谢你的例子,但是我正在寻找类似于你第一个情节的东西(图中没有按列划分变量),同时类似于第二个情节(它显示不同的值对于每一列,而在第一个图中,它们被一起感知) 可能最简单的方法是将数据框的列标准化为具有相同的范围(即从 0 到 1)。norm <- function(x)(x-min(x))/(max(x)-min(x))
df[,-1] <- apply(df[,-1], 2, norm)
以上是关于如何分别为不同的列创建热图?的主要内容,如果未能解决你的问题,请参考以下文章
ComplexHeatmap:如何以不同的方式放置热图图例和注释图例?