这里以火山图为例进行说明,在转录组分析中,火山图是很常见的一类图,纵轴表示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. vi、wc、gzip、bzip2、tar、yum安装、dpek、用户信息操作等命令

    命令模式 输入"dd"即可将这一行删除 按下"p"即可粘贴 插入模式: a:从光标这个位置之后插入 A:在行尾插入 i:从光标之前插入 I:行首插入 o:在光标 ...

  2. redis如何实现高可用【主从复制、哨兵机制】

    实现redis高可用机制的一些方法: 保证redis高可用机制需要redis主从复制.redis持久化机制.哨兵机制.keepalived等的支持. 主从复制的作用:数据备份.读写分离.分布式集群.实 ...

  3. vlc音视频开发(二)环境搭建(VS篇)

    来源:微信公众号「编程学习基地」 目录 简介 VS配置vlc开发环境 下载vlc源码 创建vlc环境 测试vlc代码 运行vlc程序 完成项目文件获取 简介 VLC 是一款自由.开源的跨平台多媒体播放 ...

  4. 微信小程序swiper实现 句子控app首页滑动卡片

    微信小程序swiper实现 句子控app首页滑动卡片 引言:最近看到句子控APP首页的效果很清新,可是发现他的微信小程序端没有实现这个功能,我看了一下难度不大,于是尝试着去实现. 实现效果如下: 1. ...

  5. Chrony时间同步

    chrony 服务器 yum -y install chrony cp /etc/chrony.conf{,.bak} #备份默认配置 cat > /etc/chrony.conf <&l ...

  6. kubernetes进阶(四)服务暴露-ingress控制器之traefik

    上一章我们测试了在集群内部解析service名称, 下面我们测试在集群外部解析: 根本解析不到,因为我们外部用的dns是10.4.7.11,也就是我们的自建bind dns,这个DNS服务器上也没有响 ...

  7. ARMv7-A 架构下的MMU

    ARM架构中MMU的作用主要就是将CPU发出的虚拟地址转换成为物理地址,从实现内核和用户程序和用户程序之间的虚拟地址空间隔离.MMU的主要组成为两部分,其一是内部的TLBs缓存:还有就是转换表装换单元 ...

  8. node mailer & email bot

    node mailer & email bot email https://nodemailer.com/about/ https://github.com/nodemailer/nodema ...

  9. Flutter使用WebSockets

    文档 注意是WebSockets而不是socket.io install dependencies: web_socket_channel: demo import 'dart:convert'; i ...

  10. Flutter 使用Tabbar不要Title

    原文 Demo 1 import 'package:flutter/material.dart'; void main() => runApp(MyApp()); class MyApp ext ...