ggplot2:坐标轴或legend的label长度

1. 示例

clusterProfiler包用于富集分析和可视化是非常好用的,语法简洁而统一。

但是使用clusterProfiler包进行富集分析并绘图有时会遇到一个情况:一个富集分析的Terms的长度太长,会导致图片的轴标题或者legend很长,就会压缩了主绘图区域的显示。

一个示意图如下图所示,其实此图中的GO Terms长度相对是可以接受,实际情况下可能会遇到非常长的GO Terms,导致整个图的比例非常失调。

如果可以按照一定的长度折叠过长的GO Terms的话,那么这个问题就能得到解决了。

library(tidyverse)
library(clusterProfiler)
library(org.Hs.eg.db)
data(geneList, package="DOSE")

gene <- names(geneList)[abs(geneList) > 2]
ego <- enrichGO(gene          = gene,
                universe      = names(geneList),
                OrgDb         = org.Hs.eg.db,
                ont           = "BP",
                pAdjustMethod = "BH",
                pvalueCutoff  = 0.01,
                qvalueCutoff  = 0.05,
                readable      = TRUE)
dotplot(ego)

plot

2. scale函数处理坐标轴标题

由于dotplot绘图的图像是一个ggplot2对象,其实使用scale系列函数就可以达到目的。

x/y轴标题或刻度标签进行操作,则使用scale_x/y系列函数,由于y是离散变量,因此使用scale_y_discrete函数,相应的如果y轴是连续变量,则是使用scale_y_continuous函数。由于x轴是连续变量,则使用scale_x_continuous函数调整。

scale_x/y系列函数中,labels参数是控制的轴刻度标签的显示,这个参数可以接受一个函数,函数接受原来的labels,然后返回修改过的labels

除了labels,breakslimits等参数也可以接受函数作为实参。

有的时候,ggplot2图是经过坐标轴变换的,如使用coord_flip进行x、y轴反转。此时竖直的坐标轴实际上是x轴,需要使用scale_x系列函数控制。

  • 示例,调整y轴刻度标签
dotplot(ego) + scale_y_discrete(labels = function(x) str_wrap(x, width = 40) )
  • 函数: str_wrap(string, width = 80, indent = 0, exdent = 0)
  • 参数:控制字符串输出格式
  • string: 字符串,字符串向量。
  • width: 设置一行所占的宽度。
  • indent: 段落首行的缩进值
  • exdent: 段落非首行的缩进值

plot2

3. scale函数处理legend

考虑一个相对复杂的情况,有些时候过长的 labels是出现在legend中 ,而且 str_wrap只在有空格的地方才会折叠 ,那么一个很长的没有空格的字符串需要如何处理才能折叠?

首先在legend中也是同样的处理,只不过根据此legend映射的美学不同而选择不同scale函数:如scale_colorscale_fillscale_size等等。而对于过长的字符串,可以考虑手动截断,比如:

iris %>% mutate(Species = fct_recode(Species, setosasetosasetosasetosasetosa = "setosa")) %>%
  ggplot(aes(x = Sepal.Length, y = Petal.Length, color = Species)) + geom_point() +
  scale_color_discrete(labels = function(x)  str_replace(x, "(.{20})", "\\1\n") )

plot3
legend是映射的color,则使用scale_color系列函数

由于其中一个label是setosasetosasetosasetosasetosa,中间没有空格,所以使用str_wrap函数也不会有效果,此时可以使用str_replace函数进行正则替换,(.{20})代表任意20个任意字符,由于匹配默认从字符串前面开始,所以可以不指定开头锚定符,指定的话就是(^.{20}),替换为\\1\n\\1代表前面匹配到的字符串,\n代表添加一个换行

另外clusterProfiler里面有一个legend过长的情况,是不能简单的使用scale_color_discrete的,如下:
plot4
这个图直接使用scale_color_discrete进行修改是不会有任何改变的,因为这个图的color映射并不是ggplot2的默认情况,而是使用ggraph的geom_edge图层定义的,需要使用ggraph特别定义的一个scale函数

cnetplot(ego, colorEdge = TRUE, circular = TRUE) + 
  ggraph::scale_edge_color_discrete(labels = function(x) str_wrap(x, 30) )

plot5

  • 5
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值