You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在R语言热力图中为每个X类别添加黑色轮廓

为指定ID类别添加黑色轮廓的多张热力图实现

问题背景

现有如下数据集,需要生成多张热力图,每张图为一个特定的id类别添加黑色轮廓。

数据集

data <- data.frame(
  id = c("john","john","john","kate","kate","kate","chris","chris","chris"),
  group = c("geo","his","math","geo","his","math","geo","his","math"),
  grade = c(65,76,87,67,89,98,99,97,96),
  class = c("A","A","A","A","A","A","B","B","B")
)

原始热力图代码

mine.heatmap <- ggplot(data = data, mapping = aes(x = id, y = group, fill = grade)) +
  geom_tile() +
  xlab(label = "id") + 
  ylab(label = "group") +
  labs(fill = "grade") +
  scale_fill_gradient2(low = "#800080", high = "#FF8C00", mid = "white")

x <- mine.heatmap + facet_grid(cols = vars(class), scales = "free", space = "free")

x + theme(
  axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1, size = 18, margin = margin(b=2)),
  axis.text.y = element_text(angle = 0, vjust = 0.5, hjust=1, size = 18),
  legend.text = element_text(size=14),
  legend.title = element_text(size=14),
  strip.text = element_text(size=14),
  axis.title.x = element_text(size=18),
  axis.title.y = element_text(size=18)
)

原始热力图效果:
原始热力图

期望效果

分别为每个id添加黑色轮廓的热力图:

  • 为john类别加轮廓
    john类别加轮廓
  • 为kate类别加轮廓
    kate类别加轮廓
  • 为chris类别加轮廓
    chris类别加轮廓

解决方案

通过叠加图层的方式,针对每个特定id单独绘制带黑色边框的tile,即可实现需求。以下提供两种实现方式:

方式1:批量生成所有id的热力图

# 获取所有唯一id
unique_ids <- unique(data$id)

# 循环生成每张图
for (target_id in unique_ids) {
  p <- ggplot(data = data, aes(x = id, y = group, fill = grade)) +
    geom_tile() +
    # 为目标id添加黑色轮廓
    geom_tile(data = subset(data, id == target_id), 
              aes(x = id, y = group), 
              color = "black", size = 2, fill = NA) +
    xlab("id") + 
    ylab("group") +
    labs(fill = "grade", title = paste("为", target_id, "添加轮廓")) +
    scale_fill_gradient2(low = "#800080", high = "#FF8C00", mid = "white") +
    facet_grid(cols = vars(class), scales = "free", space = "free") +
    theme(
      axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1, size = 18, margin = margin(b=2)),
      axis.text.y = element_text(angle = 0, vjust = 0.5, hjust=1, size = 18),
      legend.text = element_text(size=14),
      legend.title = element_text(size=14),
      strip.text = element_text(size=14),
      axis.title.x = element_text(size=18),
      axis.title.y = element_text(size=18),
      plot.title = element_text(size=18, hjust=0.5)
    )
  # 打印图片,如需保存可取消下方注释
  print(p)
  # ggsave(paste0("heatmap_", target_id, ".png"), p, width = 8, height = 6)
}

方式2:单独生成单张图

如果只需要生成某一个id的图(比如john):

ggplot(data = data, aes(x = id, y = group, fill = grade)) +
  geom_tile() +
  geom_tile(data = subset(data, id == "john"), 
            aes(x = id, y = group), 
            color = "black", size = 2, fill = NA) +
  xlab("id") + 
  ylab("group") +
  labs(fill = "grade", title = "为john添加轮廓") +
  scale_fill_gradient2(low = "#800080", high = "#FF8C00", mid = "white") +
  facet_grid(cols = vars(class), scales = "free", space = "free") +
  theme(
    axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1, size = 18, margin = margin(b=2)),
    axis.text.y = element_text(angle = 0, vjust = 0.5, hjust=1, size = 18),
    legend.text = element_text(size=14),
    legend.title = element_text(size=14),
    strip.text = element_text(size=14),
    axis.title.x = element_text(size=18),
    axis.title.y = element_text(size=18),
    plot.title = element_text(size=18, hjust=0.5)
  )

核心逻辑:通过geom_tile叠加一层仅包含目标id的图层,设置color="black"和较大的size值显示黑色轮廓,fill=NA保证不覆盖原有填充色。

内容的提问来源于stack exchange,提问作者T K

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 14:45:40