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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 04:05:01