如何用宽格式数据绘制热图?为何heatmap()函数无法运行?
问题:ggplot2中调用
heatmap()函数无法正常运行的原因及解决方法 嗨,我来帮你分析下代码跑不起来的原因,以及怎么修改才能画出你想要的热图~
为什么heatmap()无法正常运行?
heatmap()不属于ggplot2体系:heatmap()是R基础包的独立绘图函数,有自己的绘图逻辑,不能直接作为图层加到ggplot()后面。ggplot2的绘图是靠geom_*系列函数实现的,画热图需要用geom_tile()这类图层。- 数据格式不匹配:你的数据是宽格式(每列对应一种样本类型),但ggplot2绘制热图需要长格式数据——也就是要有一列专门表示样本类型,一列对应基因表达值。
- 映射参数错误:你在
aes()里写了三个x轴参数(x=Exposed,Recovered,Immune),这不符合ggplot2的映射规则,x轴只能对应一个变量。
修正后的完整代码实现
我们先把数据转成适合ggplot的长格式,再用geom_tile()绘制热图,完全匹配你想要的y轴为Genus、x轴为样本类型的样式:
# 加载所需包 library(ggplot2) library(tidyr) # 用于转换数据格式 # 你的原始数据 data1 <- structure(list(Genus = structure(1:15, .Label = c("a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o"), class = "factor"), ID = structure(c(1L, 8L, 9L, 10L, 11L, 12L, 13L, 14L, 15L, 2L, 3L, 4L, 5L, 6L, 7L), .Label = c("1", "10", "11", "12", "13", "14", "15", "2", "3", "4", "5", "6", "7", "8", "9"), class = "factor"), Exposed = c(4.45664848317392, 3.47352433833294, 1.06264726491645, 2.19005092629232, 2.26533363806084, 3.31810337258503, 0.624824835686013, 1.69351499876939, 0.831915790913627, 3.34144014748745, 1.04171383427456, 2.29188611265272, 3.61610786640085, 0.26214003097266, 4.43111610598862 ), Recovered = c(1.42280009156093, 2.54399934201501, 2.02104107988998, 2.04466922697611, 2.28061385918409, 0.993064268259332, 1.05062131932937, 1.1557382948231, 2.36977807246149, 0.546837221598253, 2.07467105076648, 0.675126203102991, 1.78709530178457, 1.71838806266896, 0.769032474607229 ), Immune = c(0.0398402754217386, 0.33513950847555, 0.30276765988674, 0.191129956976511, 0.0744170512771234, 0.484796752454713, 0.0741345254937187, 0.183232698123902, 0.472231584484689, 0.45325757318642, 0.0141741185216233, 0.122682133689523, 0.189284125575796, 0.00848434411454946, 0.351375629426911 )), .Names = c("Genus", "ID", "Exposed", "Recovered", "Immune" ), row.names = c(NA, -15L), class = "data.frame") # 转换为长格式:保留Genus,将Exposed/Recovered/Immune拆分为Sample_Type和Expression两列 data_long <- pivot_longer(data1, cols = c(Exposed, Recovered, Immune), names_to = "Sample_Type", values_to = "Expression") # 绘制热图 ggplot(data_long, aes(x = Sample_Type, y = Genus, fill = Expression)) + geom_tile(color = "white") + # 用白色边框区分每个单元格 scale_fill_gradient(low = "#f7fbff", high = "#08306b") + # 设置颜色渐变,可按需调整 labs(x = "样本类型", y = "属(Genus)", fill = "基因表达值") + # 设置坐标轴和图例标签 theme_minimal() + # 选用简洁主题 theme(axis.text.y = element_text(size = 8)) # 调整y轴文字大小,避免拥挤
代码关键说明
- 数据格式转换:
pivot_longer()把宽格式数据转成长格式,让每个样本类型和对应的表达值成为单独的行,这是ggplot绘图的标准要求。 - 热图核心绘制:通过
aes()指定x为样本类型、y为Genus、fill为表达值,再用geom_tile()生成热图的单元格。 - 样式优化:
scale_fill_gradient()控制颜色渐变效果,theme_minimal()让图表更清爽,你也可以根据参考图的风格调整颜色或主题细节。
内容的提问来源于stack exchange,提问作者Anton Schneider
相关产品推荐
相关产品推荐

