这里以火山图为例进行说明,在转录组分析中,火山图是很常见的一类图,纵轴表示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. Educational Codeforces Round 89 (Rated for Div. 2) D. Two Divisors (数学)

    题意:有\(n\)组数,对于每组数,问是否能找到两个因子\(d_{1},d{2}\),使得\(gcd(d_{1}+d_{2},a_{i}=1)\),如果有,输出它们,否则输出\(-1\). 题解:对于 ...

  2. WPF 主动触发依赖属性的 PropertyChanged

    需求背景 需要显示 ViewModel 中的 Message/DpMessage,显示内容根据其某些属性来确定.代码结构抽象如下: // Model public class Message : IN ...

  3. 2020ICPC·小米 网络选拔赛第一场

    2020ICPC·小米 网络选拔赛第一场 C-Smart Browser #include <string> #include <iostream> std::string s ...

  4. ELK Stack 介绍 & Logstash 日志收集

    ELK Stack 组成 Software Description Function E:Elasticsearch Java 程序 存储,查询日志 L:Logstash Java 程序 收集.过滤日 ...

  5. Python——Django框架——Model数据库模型

    一.设置 1.Django的setting中配置数据库(MySQL配置) DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql' ...

  6. HTTP2.0 的学习笔记

    1 1 1 HTTP2.0 1 11 1 1 1 1 1 1 超文本传输安全协议(英语:Hypertext Transfer Protocol Secure,缩写:HTTPS,也被称为HTTP ove ...

  7. infinite scroll blogs

    infinite scroll blogs 无限滚动 blogs beacon api https://www.sitepoint.com/introduction-beacon-api/ Histo ...

  8. Taro 框架实现原理

    Taro 框架实现原理 小程序 H5 RN Web 多端框架 Taro 1.x & Taro 2.x 编译型架构, 语法编译转换 Taro 1/2 属于编译型架构,主要通过对类 React 代 ...

  9. MDN & JavaScript 文档翻译状态

    MDN & JavaScript 文档翻译状态 https://developer.mozilla.org/zh-CN/docs/MDN/Doc_status/JavaScript refs ...

  10. js web简单的路由管理器

    灵感来自此博客和此库 index.html <!DOCTYPE html> <html lang="en"> <head> <meta c ...