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

R语言ggplot2绘制fgsea柱状图:过长通路标签换行问题求解

问题描述

使用library(fgsea)完成富集分析后,用ggplot2绘制柱状图时,过长的pathway名称标签导致图像显示错乱。尝试过stringr::str_wrap()和strwrap()处理标签换行,但效果不理想,求可行的解决办法。

附分析结果results数据框:

View(results)
                                        pathway         pval       padj        ES      NES nMoreExtreme size  leadingEdge
1                       GOCC_CORNIFIED_ENVELOPE 0.0001061684 0.01894047 0.8468409 2.168420            0   56 KRT77, C....
2                           GOBP_KERATINIZATION 0.0001061684 0.01894047 0.8465294 2.167623            0   56 KRT77, C....
3       GOBP_INTERMEDIATE_FILAMENT_ORGANIZATION 0.0001064849 0.01894047 0.7977803 2.037876            0   55 KRT77, K....
4                         GOCC_KERATIN_FILAMENT 0.0001105828 0.01894047 0.8149854 2.005688            0   39 KRT77, C....
5 GOMF_STRUCTURAL_CONSTITUENT_OF_SKIN_EPIDERMIS 0.0001156069 0.01917240 0.8476196 1.996867            0   28 KRT77, K....
6            GOMF_SEQUENCE_SPECIFIC_DNA_BINDING 0.0000999900 0.01894047 0.4561934 1.286778            0 1520 HOXD13, ....
可行解决方法

方案1:正确使用str_wrap并配合标签对齐

多数情况是str_wrap参数设置不当,或未在ggplot的轴标签配置中正确应用。可以先预处理pathway列,再绘图:

library(ggplot2)
library(stringr)

# 预处理标签,设置每行最大字符数(可按需调整)
results$pathway_wrap <- str_wrap(results$pathway, width = 20)

# 绘制柱状图,使用处理后的标签
ggplot(results, aes(x = NES, y = pathway_wrap)) +
  geom_col(aes(fill = padj)) +
  labs(y = "Pathway", x = "Normalized Enrichment Score (NES)") +
  theme(axis.text.y = element_text(hjust = 1)) # 调整y轴文本右对齐

方案2:替换下划线为换行符

GO通路名称用下划线分隔,直接将下划线替换为换行符,更贴合语义逻辑:

# 把下划线替换成换行符
results$pathway_wrap <- gsub("_", "\n", results$pathway)

ggplot(results, aes(x = NES, y = pathway_wrap)) +
  geom_col(aes(fill = padj)) +
  labs(y = "Pathway", x = "NES") +
  theme(axis.text.y = element_text(lineheight = 1.2)) # 调整行高避免拥挤

方案3:旋转x轴标签(若通路名在x轴)

如果pathway放在x轴,直接旋转标签角度避免重叠:

ggplot(results, aes(x = pathway, y = NES)) +
  geom_col(aes(fill = padj)) +
  labs(x = "Pathway", y = "NES") +
  theme(axis.text.x = element_text(angle = 45, hjust = 1, vjust = 1)) # 旋转45度并对齐

方案4:动态处理标签(无需修改原数据框)

不提前修改results,直接在ggplot的scale_y_discrete中调用str_wrap处理标签:

ggplot(results, aes(x = NES, y = pathway)) +
  geom_col(aes(fill = padj)) +
  labs(y = "Pathway", x = "NES") +
  scale_y_discrete(labels = function(x) str_wrap(x, width = 18)) +
  theme(axis.text.y = element_text(hjust = 1))

内容的提问来源于stack exchange,提问作者Young Tae Won

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 01:47:43