前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >R tips:调整ggplot2的坐标轴或legend的label长度

R tips:调整ggplot2的坐标轴或legend的label长度

作者头像
王诗翔呀
发布2022-01-21 19:38:05
5.8K0
发布2022-01-21 19:38:05
举报
文章被收录于专栏:优雅R优雅R

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

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

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

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

代码语言:javascript
复制
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)

scale函数处理坐标轴标题

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

对y轴标题进行操作,则使用scale_y系列函数,由于y是离散变量,因此使用scale_y_discrete函数,相应的如果y轴是连续变量,比如此时的x轴,就使用scale_x_continuous函数调整。

labels参数是控制的轴标题的显示,这个参数可以接受一个函数,函数接受原来的labels,然后返回修改过的labels。

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

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

代码语言:javascript
复制
dotplot(ego) + scale_y_discrete(labels = function(x) str_wrap(x, width = 40) )

scale函数处理legend

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

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

代码语言:javascript
复制
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的,如下:

代码语言:javascript
复制
cnetplot(ego, colorEdge = TRUE, circular = TRUE)

这个图直接使用scale_color_discrete进行修改是不会有任何改变的,因为这个图的color映射并不是ggplot2的默认情况,而是使用ggraph的geom_edge图层定义的,需要使用ggraph特别定义的一个scale函数:

代码语言:javascript
复制
cnetplot(ego, colorEdge = TRUE, circular = TRUE) + 
  ggraph::scale_edge_color_discrete(labels = function(x) str_wrap(x, 30) )
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-11-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 优雅R 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档