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

如何在R中将双向频数表转换为反映频数的热力图?

问题与解决方法
  • 核心需求:将双向频数表绘制成热力图,用颜色深浅区分频数大小(当前仅能区分0和非0值)
  • 当前操作遇到的问题:
    1. 生成了频数表PBP3.1Tab_alleleXemmtype <- table(PBP3.1_Table_Master$main_emm, PBP3.1_Table_Master$allele),但直接用它画热力图失败
    2. 用主数据表绘制的热力图无频数区分:
      ggplot(PBP3.1_Table_Master, aes(main_emm, allele)) +
        geom_tile(aes())
      
    3. 添加scale_fill_gradient后颜色仍无变化:
      ggplot(PBP3.1_Table_Master, aes(main_emm, allele)) +
        geom_tile(aes()) +
        scale_fill_gradient(low = "white", high = "blue")
      

解决步骤

方法一:转换频数表为数据框后绘图

频数表是table格式,ggplot需要数据框格式,先做格式转换:

# 将频数表转为数据框
freq_df <- as.data.frame(PBP3.1Tab_alleleXemmtype)
colnames(freq_df) <- c("main_emm", "allele", "count") # 重命名列,方便后续引用

# 绘制带频数区分的热力图
ggplot(freq_df, aes(x = main_emm, y = allele)) +
  geom_tile(aes(fill = count)) + # 绑定频数作为填充颜色的变量
  scale_fill_gradient(low = "white", high = "blue", name = "频数") + # 设置颜色渐变及图例名称
  theme(axis.text.x = element_text(angle = 45, hjust = 1)) # 可选:旋转x轴标签,避免重叠

方法二:直接在ggplot流程中统计频数

无需提前生成频数表,用dplyr汇总数据后绘图:

library(dplyr)

# 汇总每个组合的频数
summary_df <- PBP3.1_Table_Master %>%
  count(main_emm, allele, name = "count")

# 绘制热力图
ggplot(summary_df, aes(x = main_emm, y = allele)) +
  geom_tile(aes(fill = count)) +
  scale_fill_gradient(low = "white", high = "blue", name = "频数") +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

关键说明

之前的代码没有给geom_tile的fill参数绑定频数变量,导致所有非零值用默认颜色填充,无法区分大小。只要把频数(count)映射到fill参数,再配合颜色渐变刻度,就能实现按频数深浅区分颜色的效果。

内容的提问来源于stack exchange,提问作者Asha Marshall

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 14:52:44