首页 > 解决方案 > 通过因子变量的模式或其他方式填充geom_tile以在R中创建热图

问题描述

我正在尝试使用三个因素在 R 中创建热图。我希望能够使用其中一个因素的模态类别来填充颜色,但我无法找到如何做到这一点。

当我尝试使用 geom_tile 的 ggplot 时,它确实会生成热图,但是,我不确定它如何选择填充变量的值。这当然不是模式,因为我已经检查过了。

例如,使用内置数据集 ChickWeight,我希望填充基于我创建的变量“weight_group”的模态(最常见)类别。

data(ChickWeight)
glimpse(ChickWeight)

ChickWeight$Time <- ifelse(ChickWeight$Time >= 10,1,0)
ChickWeight <- ChickWeight %>% mutate(weight_group = ntile(weight, 3))

ChickWeight$Diet <- as.factor(ChickWeight$Diet)
ChickWeight$Time <- as.factor(ChickWeight$Time)
ChickWeight$weight_group <- as.factor(ChickWeight$weight_group)


table(ChickWeight$Diet, ChickWeight$Time, ChickWeight$weight_group)

ggplot(data = ChickWeight, aes(x=Time, y=Diet, fill=weight_group)) + 
  geom_tile()

ggplot 的结果

根据三通表,当Diet==1 & Time==1为weight_group==1时,右下块应该是粉红色(对应weight_group==1)而不是绿色作为weight_group的模态类别(11个计数) )。

对此的任何帮助将不胜感激。

谢谢!

标签: rggplot2heatmap

解决方案


您可以定义一个函数 getMode,该函数使用 plyr 的 count 函数计算向量的模式,以创建每个类的计数数据框。然后对数据框进行排序,得到最高值。

library(plyr)
getMode <- function(vec){
  df <- plyr::count(vec) %>%
    arrange(-freq)
  return(df[1,"x"])
}

从这里按时间和饮食分组,因此您可以找到这些组的每个组合的模式,然后将其用作 ggplot 的填充。

ChickWeight %>%
  group_by(Time, Diet) %>%
  summarize(modeWeightGroup = getMode(weight_group)) %>%
  ggplot(aes(x=Time, y=Diet, fill= modeWeightGroup)) + 
  geom_tile()

我也不认为右下角的正方形应该是 weight_group 1,因为看起来三向表已经根据 weight_group 排序,所以正方形表示 weight_group 1 中的小鸡,它们的模态时间,饮食组合是(1 ,1)。


推荐阅读