如何在ggplot中合并热图并使对应变量在Y轴相邻?
解决思路与实现代码
要实现对应变量(如var_a与var_x)相邻的合并热图,核心是先合并数据框,再通过自定义因子顺序控制变量排列——直接在ggplot里配置很难实现精准的成对排序,优先处理数据结构是更稳妥的方案。
步骤1:修正原始代码错误
你的df_two_long存在数据源误用的问题,同时需要统一两个数据框的列名,保证结构一致:
library(tidyr) library(ggplot2) # 处理第一个数据框 df_one <- data.frame( vars = c("var_a", "var_b", "var_c"), corresponding_vars = c("var_x", "var_y", "var_z"), expression_organ_1_vars = c(5, 10, 20), expression_organ_2_vars = c(50, 2, 10), expression_organ_3_vars = c(5, 10, 3) ) df_one_long <- pivot_longer(df_one, cols = 3:5, names_to = "tissueType", values_to = "Expression") %>% # 清理组织名称的冗余后缀 mutate(tissueType = gsub("_vars$", "", tissueType)) # 处理第二个数据框(修正错误) df_two <- data.frame( corresponding_vars = c("var_x", "var_y", "var_z"), expression_organ_1_corresponding_vars = c(100, 320, 120), expression_organ_2_corresponding_vars = c(23, 30, 150), expression_organ_3_corresponding_vars = c(89, 7, 200) ) df_two_long <- pivot_longer(df_two, cols = 2:4, # 匹配df_two的数值列位置 names_to = "tissueType", values_to = "Expression") %>% rename(vars = corresponding_vars) %>% # 统一变量列名 mutate(tissueType = gsub("_corresponding_vars$", "", tissueType))
步骤2:合并数据并自定义变量顺序
合并两个长数据框后,手动定义成对的变量顺序,将其转为因子类型强制控制Y轴排列:
# 合并两个数据集 combined_df <- rbind(df_one_long, df_two_long) # 定义想要的变量排列顺序:成对相邻 var_order <- c("var_a", "var_x", "var_b", "var_y", "var_c", "var_z") combined_df$vars <- factor(combined_df$vars, levels = var_order)
步骤3:绘制合并热图
调整ggplot的映射(匹配目标图的轴布局),完成热图绘制:
ggplot(combined_df, aes(x = tissueType, y = vars, fill = Expression)) + geom_tile(color = "white", size = 1) + # 添加白色边框区分单元格 scale_fill_viridis_c(option = "plasma") + # 可选:使用更美观的连续色阶 labs(x = "组织类型", y = "变量", fill = "表达量") + theme_minimal() + theme(axis.text.x = element_text(angle = 45, hjust = 1))
关键说明
- 因子顺序是核心:ggplot默认按字母排序变量,只有将变量转为指定
levels的因子,才能强制实现var_a与var_x这类对应变量的相邻排列。 - 统一数据结构是前提:两个数据框必须拥有相同的列名,才能合并后用同一套代码绘制热图。
内容的提问来源于stack exchange,提问作者Luckystrikerr
相关产品推荐
相关产品推荐

