如何分别为不同的列创建热图?

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 &lt;- function(x)(x-min(x))/(max(x)-min(x))df[,-1] &lt;- apply(df[,-1], 2, norm)

以上是关于如何分别为不同的列创建热图?的主要内容,如果未能解决你的问题,请参考以下文章

ComplexHeatmap:如何以不同的方式放置热图图例和注释图例?

tecplot怎么让同时导入的多个文件分别为不同zone

使用 Matplotlib 在带有图例的热图中显示不同大小的圆圈

CollectionView - 每个部分的列数不同

如何创建临时表或仅从循环中的列中选择不同的值

如何使用Plotly Python组合热图和轮廓图