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

Fill geom_tile by mode of a factor variable or other ways to create a heat map in R

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

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

例如,使用内置数据集 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()

基于三向table,右下块应该是粉色(对应weight_group==1)而不是绿色作为weight_group的模态类别时Diet==1 & Time==1 is weight_group==1 (11 counts)。

如有任何帮助,我们将不胜感激。

谢谢!

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

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 因为看起来三向 table 已经根据 weight_group 排序所以方块是说 weight_group 1 中的小鸡,他们的模态时间、饮食组合是 (1,1)。

使用dplyr统计weight_group的最频繁类别对于TimeDiet的每个组合:

ChickWeight %>% 
  group_by(Time, Diet) %>% 
  count(weight_group) %>% 
  filter(n == max(n)) %>% 
  ggplot(
    aes(x = Time,
        y = Diet,
        fill = weight_group)
    ) + 
  geom_tile()

顺便说一下,既然您已经知道 dplyr::mutate,您应该知道您可以在一个 mutate 中完成您在此处所做的所有预处理。 这意味着代替:

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)

您只需输入:

ChickWeight <- 
  ChickWeight %>% 
  mutate(
    Time = as.factor(ifelse(Time>=10, 1 ,0)),
    Diet = as.factor(Diet),
    weight_group = as.factor(ntile(weight, 3))
  )