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

ggh4x已弃用后,如何在ggplot2(结合Seurat的DimPlot)中实现自定义截断坐标轴?

ggh4x已弃用后,如何在ggplot2(结合Seurat的DimPlot)中实现自定义截断坐标轴?

我太懂这种对固定可视化风格的执念了——实验室统一的绘图规范用顺手了,临时换方式真的别扭!你之前用ggh4x::guide_axis_truncated实现的短箭头坐标轴效果确实干净专业,咱们来一步步把这个效果找回来,不用折腾截图拼接。

先排查核心问题

从你描述的前后效果差异来看,大概率是两个原因之一:

  1. ggh4x包版本更新后,guide_axis_truncated的API参数发生了变化
  2. Seurat的DimPlot自带的主题优先级更高,覆盖了你自定义的主题和坐标轴设置

针对性修复方案

方案1:适配新版ggh4x的API(如果是参数变化导致的)

新版ggh4x中,guide_axis_truncated的截断参数从trunc_lower/trunc_upper改成了start/end,先把坐标轴guide的定义修正:

library(ggh4x)
library(grid)

# 重新定义截断带箭头的坐标轴
axis_trunc <- guide_axis_truncated(
  start = unit(0, "npc"),        # 坐标轴起始位置
  end = unit(2, "cm"),           # 只保留2cm长的轴段
  arrow = arrow(type = "closed", length = unit(0.2, "cm"))  # 箭头样式
)

方案2:优化主题覆盖逻辑(解决Seurat主题冲突)

Seurat的DimPlot自带默认主题,直接叠加theme()可能被覆盖,用%+replace%强制覆盖默认主题,同时避免重复设置箭头(之前的主题里axis.line和guide的箭头可能冲突):

# 自定义主题:隐藏刻度、文本,调整标题位置
riz_theme <- theme_bw() %+replace%
  theme(
    axis.title = element_text(hjust = 0),  # 轴标题左对齐
    axis.text = element_blank(),           # 隐藏坐标轴文本
    axis.ticks = element_blank(),          # 隐藏刻度线
    axis.line = element_line(color = "black")  # 只保留轴的线条,箭头交给guide处理
  )

方案3:调整绘图代码的叠加顺序

把自定义的guides和theme放在最后,确保它们能覆盖Seurat的默认设置:

# 最终绘图代码
DimPlot(COs, group.by = "Phase") +
  NoLegend() +
  ggtitle('By Phase') +
  # 应用自定义截断坐标轴
  guides(x = axis_trunc, y = axis_trunc) +
  # 应用自定义主题
  riz_theme +
  # 你的其他自定义PDF元素(保留原有设置)
  riz_legend_pdf + 
  riz_guides_pdf

额外排查点

如果上述方案还没解决,你可以:

  • 检查ggh4x版本:用packageVersion("ggh4x")查看,要是新版本不兼容,直接回退到之前能用的版本:remotes::install_version("ggh4x", version = "0.2.0")(替换成你之前用的版本号)
  • 确认DimPlot的坐标轴范围:有些情况下,UMAP的坐标轴范围变化会导致截断效果不明显,可以用xlim()/ylim()固定范围后再测试

这样调整后,应该就能找回你想要的那种简洁的短箭头坐标轴效果啦,比截图拼接高效多了!

备注:内容来源于stack exchange,提问作者Riz02

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.13 18:14:33