通过因子变量的模式或其他方式填充 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
的最频繁类别对于Time
和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))
)
我正在尝试使用三个因素在 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
的最频繁类别对于Time
和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))
)