用多种颜色填充 Geom_Raster

Fill Geom_Raster with Multiple Colors

我有一个包含 3 列的数据框,我想使用 geom_raster 显示其中的 x 轴、y 轴和填充都包含分类值。我的原始数据集的目标是用填充显示重叠数据,并显示 x 轴上没有数据的位置。对于 x 和 y 的某些组合,可能会应用多个填充,但是,geom_raster 仅在最后一次出现填充时填充单元格。相反,我想堆叠所有填充,类似于百分比堆叠条形图,如果只应用一个填充,则用该颜色填充整个单元格。但是,如果应用 3 个填充值,则在所有三种颜色中平均填充其堆栈,即每种颜色 33%。

对于我的示例数据集,我模拟了 26 人之间的 2 场铁人三项比赛,他们被分配了第一名、最后一名或第二名的速度(156 项个人赛事 = 26 人 x 3 项赛事 x 2 场比赛)。然后我通过将 NA 值分配给 26 个随机位置来随机分配未完成。然后,我创建了一个光栅,显示每个人在合并比赛的每个事件中的位置,并根据他们是否完成了 'first'、'second' 或“last.”来显示颜色。如果它们没有为事件放置,这也会导致空(白色)单元格。 x 轴表示人,y 轴表示铁人三项赛中的 3 个事件,这将创建一个包含 78 个像元的栅格。对于这个最小示例,我的目标是根据每场比赛的完成情况堆叠每个单元格的填充物。由于此数据集包含 2 个铁人三项比赛,因此每个单元格有 2 个可能的填充。如果一个人为给定的事件放置相同的位置,那么它应该是相同的颜色。如果它们放置的位置不同,则应将单元格一分为二,每个位置使用一种颜色。目前,代码根据最后出现的值填充整个单元格(例如,他们在第二场比赛中的位置)。例如,某人 'A' 在第一场比赛的自行车比赛中排名第二,但在第二场比赛中没有完成,在第一场比赛中 运行 排名第一,在第二场比赛中排名最后,在游泳比赛中排名第二第一场比赛并没有在最后一场比赛中名列前茅。但是,光栅显示 A 没有完成游泳,运行ning 排在最后,也没有完成骑自行车。如何堆叠 geom_raster 中单元格的填充?

我希望代码中的一个重要部分是确保单元格的大小完全相同。因此,如果某人参加了 10 场比赛,他们的单元格将有 10 个可能的填充,而参加 3 场比赛的人将只有 3 个。但他们的单元格的整体大小应该相同。或者例如对于上面的数据集,如果我们删除了他们没有完成的地方,df %>% drop_na(),具有 2 个值的单元格应该与具有 1 个值的单元格大小相同。

可重现代码

#num races
num_races = 2

#create fake data
#make the random speed below reproducible
set.seed(001)
df <- data.frame(
  person = rep(LETTERS,3*num_races),
  event = rep(c('swim','run','bike'),26*num_races),
  place = sample(rep(c('first','second','last'),26*num_races)))

#set some random did not finish
set.seed(001)
df$place[sample(1:156,26)] <- NA

#Person A had multiple speeds for running, raster colors by the final occurng place
df %>%
  filter(person == 'A') %>%
  arrange(event)

#create the raster
df %>%
  ggplot(aes(x=person, y=event)) +
    geom_raster(aes(fill=place)) + 
    scale_x_discrete(position="top") +
    scale_y_discrete(expand = c(0,0)) +
    geom_hline(yintercept = c(1:2+0.5), size=0.7) +
    scale_fill_manual(values = c("first"="green","second"="blue",
                                 "last"="red"),
                      na.value = "white") +
    labs(x="Person", y="Event") +
    theme_classic() + 
    theme(axis.text.y=element_text(size=9),
          axis.title = element_text(size=18),
          panel.border = element_rect(fill=NA, size=0.7))

当前图表

在 Photoshop 中修改图表以显示我想要的人物 A

但是以编程方式为所有人执行此操作。我降低了其他所有内容的不透明度,以专注于我手动修改的人 A。

类似问题

我找到了,表明每个单元格的最后一次出现用于填充,但它对填充多个分类值没有帮助。

您所描述的内容不能通过使用 geom_raster 创建,至少在没有相当多的数据操作的情况下是这样。我会使用 geom_colposition_fill,并使 y 轴脱离小平面:

df %>%
  ggplot(aes(x=person, y = ifelse(is.na(place), 0, 1))) +
    geom_col(aes(fill=place), position = position_fill(), width=1) + 
    scale_x_discrete(position="top") +
    scale_y_continuous(expand = c(0,0)) +
    scale_fill_manual(values = c("first"="green","second"="blue",
                                 "last"="red")) +
    facet_grid(event~., switch = "y") +
    labs(x="Person", y="Event") +
    theme_classic() + 
    theme(axis.text.y=element_text(size=9),
          axis.title = element_text(size=18),
          panel.border = element_rect(fill=NA, size=0.7),
          panel.spacing = unit(0, 'mm'),
          axis.text.y.left = element_blank(),
          axis.ticks.y = element_blank(),
          strip.background = element_blank(),
          axis.line.y.left = element_blank(),
          strip.text = element_text(size = 14))