使用Aplot对齐ggtree与ggridges脊线图失败:脊线不显示问题排查
解决ggtree与ggridges脊线图对齐问题
问题核心在于进化树的tip顺序与脊线图的y轴因子顺序不匹配,同时ggridges默认主题的布局设置会干扰aplot的对齐逻辑。以下是修正后的完整代码:
library(ggtree) library(ggridges) library(aplot) library(ggplot2) library(dplyr) # 生成进化树 tree <- rtree(3) p_tree <- ggtree(tree) + theme_tree() # 生成脊线图数据,确保label顺序与树的tip一致 set.seed(123) tip_labels <- tree$tip.label data <- data.frame( label = rep(tip_labels, each = 50), value = unlist(lapply(tip_labels, function(x) rnorm(50, mean = which(tip_labels == x)))) ) %>% # 将label转换为因子,固定顺序为树的tip顺序 mutate(label = factor(label, levels = tip_labels)) # 绘制脊线图:直接用stat="density",避免手动计算密度的缩放问题;简化主题 p_ridges <- ggplot(data, aes(x = value, y = label, fill = label)) + geom_density_ridges(scale = 1, alpha = 0.8, rel_min_height = 0.01) + theme_minimal() + theme( legend.position = "none", axis.title.y = element_blank(), # 去掉y轴标题,避免和树的标签重叠 axis.text.y = element_blank(), # 去掉y轴文本,因为树已经有tip标签 panel.grid = element_blank() # 去掉网格线,更美观 ) # 组合图:aplot会自动匹配y轴的因子顺序实现对齐 aligned_plot <- insert_right(p_tree, p_ridges, width = 1.5) print(aligned_plot)
关键修正点:
- 固定y轴因子顺序:将
label转换为因子,levels设置为tree$tip.label,确保脊线图的y轴顺序和进化树的tip顺序完全一致,这是对齐的核心前提。 - 简化脊线图主题:替换
theme_ridges()为theme_minimal(),并移除y轴文本和标题,避免主题自带的间距、缩放设置干扰aplot的对齐逻辑。 - 使用默认密度统计:放弃手动计算密度,直接用
geom_density_ridges的默认stat="density",减少手动缩放带来的误差,同时添加rel_min_height = 0.01确保低密度区域也能显示。
如果之前尝试cowplot/patchwork失败,也可以用patchwork结合ggtree::tree_view获取y轴位置手动对齐,但aplot在处理ggtree这类特殊ggplot对象时,只要y轴匹配,对齐会更顺畅。
内容的提问来源于stack exchange,提问作者Ewan Smith
相关产品推荐
相关产品推荐

