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)
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,breaks
、limits
等参数也可以接受函数
作为实参。
有的时候,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: 段落非首行的缩进值
3. scale函数处理legend
考虑一个相对复杂的情况,有些时候过长的 labels是出现在legend中 ,而且 str_wrap只在有空格的地方才会折叠 ,那么一个很长的没有空格的字符串需要如何处理才能折叠?
首先在legend中也是同样的处理,只不过根据此legend映射的美学不同而选择不同scale函数
:如scale_color
、scale_fill
、scale_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") )
legend是映射的color,则使用scale_color系列函数
。
由于其中一个label是setosasetosasetosasetosasetosa,中间没有空格,所以使用str_wrap函数也不会有效果,此时可以使用str_replace函数
进行正则替换,(.{20})代表任意20个任意字符,由于匹配默认从字符串前面开始,所以可以不指定开头锚定符,指定的话就是(^.{20}),替换为\\1\n
,\\1代表前面匹配到的字符串,\n代表添加一个换行
。
另外clusterProfiler里面有一个legend过长的情况,是不能简单的使用scale_color_discrete的,如下:
这个图直接使用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) )