我正在尝试使用三个因素在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()
基于三元表,当Diet == 1和Time == 1是weight_group == 1时,右下块应为粉红色(对应weight_group == 1),而不是绿色作为weight_group的模式类别。 (11个计数)。
对此将提供任何帮助。
谢谢!
答案 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)
使用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))
)