这里以火山图为例进行说明,在转录组分析中,火山图是很常见的一类图,纵轴表示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. HDU - 1789 dp

    题意: 众所周知lyb根本不学习.但是期末到了,平时不写作业的他现在有很多作业要做. CUC的老师很严格,每个老师都会给他一个DDL(deadline). 如果lyb在DDL后交作业,老师就会扣他的分 ...

  2. JavaScript——内置对象

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

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

  4. Kubernets二进制安装(12)之部署Node节点服务的kube-Proxy

    kube-proxy是Kubernetes的核心组件,部署在每个Node节点上,它是实现Kubernetes Service的通信与负载均衡机制的重要组件; kube-proxy负责为Pod创建代理服 ...

  5. oslab oranges 一个操作系统的实现 实验二 认识保护模式

    https://github.com/yyu/osfs00 实验目的: 理解x86架构下的段式内存管理 掌握实模式和保护模式下段式寻址的组织方式. 关键数据结构.代码组织方式 掌握实模式与保护模式的切 ...

  6. IFIX 目录结构

    iFIX使用了许多目录存储程序和数据文件.用路径配置对话框来指定iFIX目录的位置和名称.可在SCU工具箱中单击"路径"按钮显示该对话框. 当iFIX安装后它将创建一个目录,该目录 ...

  7. spring-cloud-netflix-config

    Spring Cloud Config 在我们了解spring cloud config之前,我可以想想一个配置中心提供的核心功能应该有什么 提供服务端和客户端支持 集中管理各环境的配置文件 配置文件 ...

  8. Celery&Flower文档笔记

    1.Celery # tasks.py from celery import Celery app = Celery('tasks', broker='redis://localhost:6379', ...

  9. flex item default All In One

    flex item default All In One flex item default 初始值 === flex: 0 1 auto; https://drafts.csswg.org/css- ...

  10. JWT All In One

    JWT All In One OAuth 2.0 JWT JSON Web Tokens https://jwt.io refs https://www.cnblogs.com/xgqfrms/tag ...