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

时间:2019-04-29 13:25:51

标签: r ggplot2 heatmap

我正在尝试使用三个因素在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()

Result of ggplot

基于三元表,当Diet == 1和Time == 1是weight_group == 1时,右下块应为粉红色(对应weight_group == 1),而不是绿色作为weight_group的模式类别。 (11个计数)。

对此将提供任何帮助。

谢谢!

2 个答案:

答案 0 :(得分:0)

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

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)。

答案 1 :(得分:0)

使用dplyrweight_groupTime的每种组合计算Diet的最频繁类别:

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))
  )