在单个热图块中绘制具有多个类别的类热图图

问题描述 投票:0回答:1

我有纵向分类数据,我想将其可视化为类似热图的图形(参见heatmap-like plot,但对于分类变量)。

研究分为三个分组级别:研究参与者、访问会话和日历回忆日记。每次访问的主要类别是根据日历数据建立的。例如,参与者可能在 30 天中的第 28 天记录了 A 类,在 30 天的第 2 天记录了 B 类;他们将在访问级别主要被归类为 A 类)。

偶尔,日历数据会出现联系。我希望热图能够反映这些关系。

这里有一些示例数据可以使用:

dat <- data.frame(person=factor(paste0("id#", 1:5),
                                levels =rev(paste0("id#", 1:5))),
                  matrix(sample(LETTERS[1:3], 15, T), ncol = 3))

dat <- dat %>% mutate(X2 = case_when(person=="id#3" ~ "A;B;C", TRUE ~ X2))

我希望我的热图能够反映类似于 excel 输出的示例:

final heatmap

r dataframe ggplot2 plot heatmap
1个回答
0
投票
library(tidyverse)

dat %>% 
  pivot_longer(-person) %>% 
  mutate(val = 1/(str_count(value, ";")+1),
         var = str_split(value, ";")) %>% 
  unnest(var) %>% 
  group_by(person, name, var) %>% 
  summarise(val = sum(val)) %>% 
  mutate(name = as.factor(name),
         var = as.factor(var)) %>% 
 ggplot(.) +
  geom_bar(aes(person, val, fill = var), stat = "identity") +
  facet_grid(rows = ~name) +
  coord_flip() +
  theme(rect = element_blank(),
        axis.text.x = element_blank(),
        axis.title.x = element_blank(),
        axis.title.y = element_blank(),
        line = element_blank(),
        panel.spacing = unit(-1, "lines"))

© www.soinside.com 2019 - 2024. All rights reserved.