如何在R中将双向频数表转换为反映频数的热力图?
问题与解决方法
- 核心需求:将双向频数表绘制成热力图,用颜色深浅区分频数大小(当前仅能区分0和非0值)
- 当前操作遇到的问题:
- 生成了频数表
PBP3.1Tab_alleleXemmtype <- table(PBP3.1_Table_Master$main_emm, PBP3.1_Table_Master$allele),但直接用它画热力图失败 - 用主数据表绘制的热力图无频数区分:
ggplot(PBP3.1_Table_Master, aes(main_emm, allele)) + geom_tile(aes()) - 添加
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
相关产品推荐
相关产品推荐

