在同一单元格中使用多个分类变量的三角形分割图块绘制热图

plotting heatmap with triangular split tiles of more than one categorical variable in the same cell

我有这个虚拟数据集:

dat <- data.frame(ID = c(1:8),
              col1=c("A B",NA,NA,"B C","A C","A",NA,"C"),
              col2=c("A D","B G",NA,NA,NA,NA,"E","C E"),
              col3=c("A A A A",NA,"B B C B B",NA,NA,"A D","D C","C E"),
              col4=c(NA,NA,NA,"B A B",NA,NA,NA,"E"),
              row.names = c("row1","row2","row3","row4","row5","row6","row7","row8"))

我正在尝试制作此数据框的热图,其中分类变量 A、B、C、D、E、G 具有独特的颜色。如果一个单元格只有一个值,绘制热图就很容易了。这将是代码:

dat <- dat %>% gather(key = "variable", value = "value", col1:col4)
ggplot(dat3, aes(variable, ID)) + geom_tile(aes(fill = value))

但由于值不止一个,而且在某些单元格中,这些值甚至会重复,因此很难对其进行编码。要在同一个单元格中绘制 2 个以上的变量,我正在考虑将单元格分成 2 个三角形,上三角形根据一个值着色,另一个根据第二个值着色不同。任何人都可以帮忙编写代码吗?

在 excel 中,想要的情节看起来像这样 raw image

正如我在评论中提到的,Allan 的参考答案是恕我直言,是实现您想要的结果的方法。但是,要使代码正常工作,需要一步将您的数据调整为正确的形状,即通过创建诸如“A B”之类的类别组合来处理复杂的事情。但这可以使用例如修复tidyr::separate_rows。通过一些重命名,Allan 的代码无需任何调整即可工作,至少恕我直言,它接近您作为图像添加的预期结果。

library(ggplot2)
library(tidyr)
library(dplyr)

dat3 <- dat %>% 
  gather(key = "variable", value = "value", col1:col4) |> 
  separate_rows(value)

# Rename dataset and variables
df <- dat3 %>% 
  dplyr::rename(x = variable, y = ID, group = value)

# 
df1    <- df[!duplicated(interaction(df$x, df$y)),]
df2    <- df[duplicated(interaction(df$x, df$y)),]
df2    <- df[rep(seq(nrow(df)), each = 3),]
df2$x1 <- as.numeric(as.factor(df2$x))
df2$y1 <- as.numeric(as.factor(df2$y))
df2$x1 <- df2$x1 + c(-0.5, 0.5, 0.5)
df2$y1 <- df2$y1 + c(-0.5, -0.5, 0.5)
df2$z  <- rep(seq(nrow(df2)/3), each = 3)

ggplot(df1, aes(x = x, y = y, fill = group)) + 
  geom_tile() +
  geom_polygon(data = df2, aes(x = x1, y = y1, group = z), size = 0)