这里以火山图为例进行说明,在转录组分析中,火山图是很常见的一类图,纵轴表示p_value,横轴表示log (fold change)。单一的散点图绘制很简单,火山图比较难处理的地方就是一些基因的注释,基因越多,加文本注释越困难,因为文字会堆在一起,看不清。

示例数据df1是转录组做差异表达后的部分结果,df2将logFC绝对值大于0.3的挑出来了。

> head(df1)
p_val avg_logFC class gene cd avg_logFC_new2 p_val_new
1 1.628043e-43 0.4804759 P2L PI3 P2L_0.3 -0.4804759 42.78833
2 1.131599e-88 0.4565683 P2L ZG16 P2L_0.3 -0.4565683 87.94631
3 7.342746e-58 0.4192149 P2L XIST P2L_0.3 -0.4192149 57.13414
4 1.728085e-28 0.4113532 P2L FN1 P2L_0.3 -0.4113532 27.76243
5 1.288611e-33 0.4100842 P2L PIGR P2L_0.3 -0.4100842 32.88988
6 6.647279e-14 0.4035325 P2L HSPA1A P2L_0.3 -0.4035325 13.17736 df2=df1%>%filter(abs(avg_logFC_new2) > 0.3)

先看一下,没加文本的图

p <- ggplot(data = df1,aes(x = avg_logFC_new2, y = p_val_new)) +
geom_point(aes(colour = cd,size = abs(avg_logFC_new2)),alpha=0.9) +
scale_color_manual(values=c("P2L_0.3" = "#80B1D3","else" = "grey","L2P_0.3" = "#FB8072"))+
scale_x_continuous("avg_logFC",limits = c(-0.6,0.6),breaks = seq(-0.6,0.6,0.3),labels = seq(-0.6,0.6,0.3)) +
scale_y_continuous("-log10 (p-value)")+
geom_vline(xintercept=c(-0.3,0.3),lty=2,col="black",lwd=1) +
theme_bw()+
theme(
legend.background=element_blank(), legend.key=element_blank(),
legend.title = element_blank(),
panel.grid.major = element_blank(),panel.grid.minor = element_blank()
)
p
ggsave("tmp0.pdf",width = 22, height = 20, units = c("cm"))

接下来用ggplot2里面的geom_text添加文本,另建一个图层,在新图层中指定data和mapping,需要注意的是,新图层里面没有指定x和y,则会延用之前图层的x和y,也就是前面的x = avg_logFC_new2, y = p_val_new

p+geom_text(data=df2,mapping = aes(label=gene))
ggsave("tmp1.pdf",width = 22, height = 20, units = c("cm"))

这张图存在两个问题:文字直接盖在点上,遮住了点;文字相互重叠。

再看一下ggplot2的另一个函数geom_label

p+geom_label(aes(label=gene),df2,alpha=0,nudge_y = 3)
#alpha=0让文本框的背景透明,让点显露出来;nudge_y把注释框上移
ggsave("tmp2.pdf",width = 22, height = 20, units = c("cm"))

可以看到,文本框还是重叠...

这里介绍一下我用的另一个R包ggrepel,它就是解决这个问题的

p+ggrepel::geom_text_repel(
aes(label=gene),df2
)
ggsave("tmp3.pdf",width = 22, height = 20, units = c("cm"))

这个图里面重叠问题已经解决了,文本靠在点的旁边,且文本不重叠,太密集的区域有线段指向。不过大部分没有线段指向,如果点与点,文本与文本比较近,还是无法肉眼区分,最好再多加一些线段来指向。可以调整一下几个padding参数,如下:

p+ggrepel::geom_text_repel(
aes(label=gene,color=cd),df2,
size = 4, #注释文本的字体大小
box.padding = 0.5, #字到点的距离
point.padding = 0.8, #字到点的距离,点周围的空白宽度
min.segment.length = 0.5, #短线段可以省略
segment.color = "black", #segment.colour = NA, 不显示线段
show.legend = F)
ggsave("tmp4.pdf",width = 22, height = 20, units = c("cm"))

到这儿,文本注释算加完了,线段的方向还不是很满意,有些杂乱文章。

这个包里面的另一个函数geom_label_repel,可以加文本框,参数和geom_text_repel类似,

p+ggrepel::geom_label_repel(
aes(label=gene),df2
)
ggsave("tmp5.pdf",width = 22, height = 20, units = c("cm"))

需要注意的是,文本框会遮住点,调节alpha参数的话,会同时改变文本框背景和文字的透明度,这个和ggplot2里面geom_label的alpha参数不太一样。

因水平有限,有错误的地方,欢迎批评指正!

R绘图(3): 散点图添加文本注释的更多相关文章

  1. R绘图 第九篇:绘制散点图和气泡图(ggplot2)

    绘制散点图(scatterplots)使用geom_point()函数,气泡图(bubblechart)也是一个散点图,只不过点的大小由一个变量(size)来控制.散点图潜在的最大问题是过度绘图:当一 ...

  2. python opencv3 —— 常用工具、辅助函数、绘图函数(图像添加文本、矩形等几何形状)

    1. cv2.hconcat().cv2.vconcat() 将从摄像头捕获的多个图像帧,横向(cv2.hconcat)或纵向(cv2.vconcat)拼接到一起,使得可以在一个 window 中进行 ...

  3. r绘图基本

    R绘图命令分为三种类型: 高级绘图命令在图形设备上产生一个新的图区,它可能包括坐标轴,标签,标题等等. 低级画图命令会在一个已经存在的图上加上更多的图形元素,例如额外的点,线和标签. 交互式图形命令允 ...

  4. 基础R绘图

    前言: 在前面介绍了R的基础入门语法之后,现也将最近整理好的一些R的基础绘图实例提供给需要的朋友参考.(温馨提示:代码慎用!按照本博文实例进行练习的话最好能做到举一反三.代码多敲方为上策,切不可隔岸观 ...

  5. R绘图 第七篇:绘制条形图(ggplot2)

    使用geom_bar()函数绘制条形图,条形图的高度通常表示两种情况之一:每组中的数据的个数,或数据框中列的值,高度表示的含义是由geom_bar()函数的参数stat决定的,stat在geom_ba ...

  6. Matlab基本功能:自定义函数、添加块注释、定时器的试用

    1.自定义函数 新建一个m文件 在m文件里面第一行输入function [X,Y]=pll(X1,Y1,X2,Y2),这里x1 x2 y1 y2是你函数的输入值, x y是输出值,接着定义你要实现的功 ...

  7. 【译】在Asp.Net中操作PDF – iTextSharp -利用块,短语,段落添加文本

    原文 [译]在Asp.Net中操作PDF – iTextSharp -利用块,短语,段落添加文本 本篇文章是讲述使用iTextSharp这个开源组件的系列文章的第三篇,iTextSharp可以通过As ...

  8. 文本注释系统 + MarkDown

    标记系统: 笔记的要点 题材 缘起 目标 等级: 细节性 事实性 规律 法则 适用范围: 时间.地点.人物.起因.经过.结果,who what where when why how whom 6W1H ...

  9. Visual Studio Code-批量在文末添加文本字段

    小技巧一例,在vs code或notepad++文末批量添加文本字段信息,便于数据信息的完整,具体操作如下: Visual Studio Code批量添加"@azureyun.com&quo ...

随机推荐

  1. SSM框架整合(Spring + SpringMVC + MyBatis)

    搭建环境 使用Spring(业务层)整合其他的框架SpringMVC(表现层)和MyBatis(持久层) Spring框架 创建数据库表 CREATE DATABASE ssm; USE ssm; C ...

  2. SpringBoot 中使用 Swagger2 出现 whitelabel page error 解决方法

    今天使用Swagger最新版,在pom.xml引入 <dependency> <groupId>io.springfox</groupId> <artifac ...

  3. MongoDB 部署 & 基础命令

    MongoDB 官方文档 MongoDB 介绍 Mongodb 由 C++ 语言编写的,是一个基于分布式文件存储的开源数据库系统. 是专为可扩展性,高性能和高可用性而设计的数据库, 是非关系型数据库中 ...

  4. windows cmd 查看远程连接端口

    查看远程端口号 Cmd tasklist  /svc 在输出的内容中查找svchost.exe进程下termservice服务对应的PID,在此查看的PID为:276 然后输入命令:netstat   ...

  5. Pymongo 笔记

    Pymongo 1.MongoDB概念 MongoDB是一种非关系型数据库(NoSQL),MongoDB数据存储于内存,内存不足则将热度低数据写回磁盘.存储的数据结构为文档.每个数据库包含若干集合(c ...

  6. Qt开发Activex笔记(二):Qt调用Qt开发的Activex控件

    若该文为原创文章,转载请注明原文出处本文章博客地址:https://blog.csdn.net/qq21497936/article/details/113789693 长期持续带来更多项目与技术分享 ...

  7. 全球最好 css3 website

    http://www.awwwards.com/ http://www.revolution.pn/ http://www.bestcss.in/ http://www.csswinner.com/ ...

  8. free HTTPS for website! & SSL & TLS & HTTP/2 & SPDY

    HTTPS for website! 1 1 1 # OK (bugs === main domain temporarily OK) # sub domain allways OK! # partl ...

  9. css & background-image & full page width & background-size

    css & background-image & full page width & background-size https://css-tricks.com/perfec ...

  10. VAST上线后,如何提升NGK算力生态的收益和流动性?

    自比特币诞生以来,"挖矿"一词就成功地步入了大众的视野,也成为了加密货币领域最重要的组成部分之一.无论是早前基于比特币和以太坊为主的算力挖矿,还是逐步进入大众视野的质押挖矿,亦或是 ...