RNA-seq 详细教程:可视化(12)

news2024/11/18 4:31:15

学习内容

  1. 了解如何为可视化准备数据
  2. 了解如果利用可视化来探索分析结果
  3. 火山图可视化
  4. 热图可视化

可视化结果

当我们处理大量数据时,以图形方式显示该信息以获得更多信息,可能很有用。在本课中,我们将让您开始使用探索差异基因表达数据时常用的一些基本和更高级的图,但是,其中许多图也有助于可视化其他类型的数据。

我们将使用我们在前面的课程中创建的三个不同的数据对象:

  • 样本的元数据(数据框): meta
  • 每个样本中每个基因的归一化表达数据(矩阵): normalized_counts
  • 上一课中生成的 DESeq2 结果的 Tibble 版本: res_tableOE_tbres_tableKD_tb

首先,让我们从数据框中创建一个元数据 tibble(不要丢失行名!)

mov10_meta <- meta %>% 
              rownames_to_column(var="samplename") %>% 
              as_tibble()

接下来,让我们将带有 gene symbols 的列引入 normalized_counts 对象,以便我们可以使用它们来标记我们的图。 Ensembl ID 对很多事情都很有用,但作为生物学家,gene symbols 对我们来说更容易识别。

# DESeq2 creates a matrix when you use the counts() function
## First convert normalized_counts to a data frame and transfer the row names to a new column called "gene"
normalized_counts <- counts(dds, normalized=T) %>% 
                     data.frame() %>%
                     rownames_to_column(var="gene"
  
# Next, merge together (ensembl IDs) the normalized counts data frame with a subset of the annotations in the tx2gene data frame (only the columns for ensembl gene IDs and gene symbols)
grch38annot <- tx2gene %>% 
               dplyr::select(ensgene, symbol) %>% 
               dplyr::distinct()

## This will bring in a column of gene symbols
normalized_counts <- merge(normalized_counts, grch38annot, by.x="gene", by.y="ensgene")

# Now create a tibble for the normalized counts
normalized_counts <- normalized_counts %>%
                     as_tibble()
  
normalized_counts 
  • 上面的快捷方式如下:
normalized_counts <- counts(dds, normalized=T) %>% 
                     data.frame() %>%
                     rownames_to_column(var="gene") %>%
                     as_tibble() %>%
                     left_join(grch38annot, by=c("gene" = "ensgene"))

可视化DE基因

可视化结果的一种方法是简单地绘制少数基因的表达数据。我们可以通过挑选出感兴趣的特定基因或选择一系列基因来做到这一点。

  • 使用 DESeq2 plotCounts() 绘制单个基因的表达

要挑选出感兴趣的特定基因进行绘图,例如 MOV10,我们可以使用 DESeq2 中的 plotCounts()plotCounts() 要求指定的基因与 DESeq2 的原始输入匹配,在我们的例子中是 Ensembl ID

# Find the Ensembl ID of MOV10
grch38annot[grch38annot$symbol == "MOV10""ensgene"]

# Plot expression for single gene
plotCounts(dds, gene="ENSG00000155363", intgroup="sampletype"
alt
  • 使用 ggplot2 绘制单个基因的表达

如果您想更改此图的外观,我们可以将 plotCounts() 的输出保存到指定 returnData=TRUE 参数的变量中,然后使用 ggplot()

# Save plotcounts to a data frame object
d <- plotCounts(dds, gene="ENSG00000155363", intgroup="sampletype", returnData=TRUE)

# What is the data output of plotCounts()?
d %>% View()

# Plot the MOV10 normalized counts, using the samplenames (rownames(d) as labels)
ggplot(d, aes(x = sampletype, y = count, color = sampletype)) + 
    geom_point(position=position_jitter(w = 0.1,h = 0)) +
    geom_text_repel(aes(label = rownames(d))) + 
    theme_bw() +
    ggtitle("MOV10") +
    theme(plot.title = element_text(hjust = 0.5))

请注意,在下面的图中(上面的代码),我们使用 ggrepel 包中的 geom_text_repel() 来标记图中的各个点。

alt

热图

除了绘制子集,我们还可以提取所有重要基因的归一化值,并使用 pheatmap() 绘制其表达的热图。

### Extract normalized expression for significant genes from the OE and control samples (2:4 and 7:9)
norm_OEsig <- normalized_counts[,c(1:4,7:9)] %>% 
              filter(gene %in% sigOE$gene)  

现在让我们使用 pheatmap绘制热图:

### Set a color palette
heat_colors <- brewer.pal(6"YlOrRd")

### Run pheatmap using the metadata data frame for the annotation
pheatmap(norm_OEsig[2:7], 
    color = heat_colors, 
    cluster_rows = T
    show_rownames = F,
    annotation = meta, 
    border_color = NA
    fontsize = 10
    scale = "row"
    fontsize_row = 10
    height = 20)
alt

火山图

上面的图很适合查看大量基因的表达水平,但对于更多的全局视图,我们可以绘制其他图。一个常用的是火山图;其中,您在 y 轴上绘制了对数转换调整后的 p 值,在 x 轴上绘制了 log2 倍变化值。

要生成火山图,我们首先需要在结果数据中有一列,表明该基因是否被认为是基于 p 调整值的差异表达,我们将在此处包括 log2fold 变化。

## Obtain logical vector where TRUE values denote padj values < 0.05 and fold change > 1.5 in either direction

res_tableOE_tb <- res_tableOE_tb %>% 
                  mutate(threshold_OE = padj < 0.05 & abs(log2FoldChange) >= 0.58)

现在我们可以开始绘图了。 geom_point 对象最适用,因为这本质上是一个散点图:

## Volcano plot
ggplot(res_tableOE_tb) +
    geom_point(aes(x = log2FoldChange, y = -log10(padj), colour = threshold_OE)) +
    ggtitle("Mov10 overexpression") +
    xlab("log2 fold change") + 
    ylab("-log10 adjusted p-value") +
    #scale_y_continuous(limits = c(0,50)) +
    theme(legend.position = "none",
          plot.title = element_text(size = rel(1.5), hjust = 0.5),
          axis.title = element_text(size = rel(1.25)))  
alt

如果我们还想知道我们的 DE 列表中的前 10 个基因(最低的 padj)在这个图上的位置怎么办?我们可以使用 geom_text_repel() 在火山图上用基因名称标记这些点。

首先,我们需要按 padjres_tableOE tibble 进行排序,并向其添加一个额外的列,以包含我们要用于标记图的那些基因名称。

## Add all the gene symbols as a column from the grch38 table using bind_cols()
res_tableOE_tb <- bind_cols(res_tableOE_tb, symbol=grch38annot$symbol[match(res_tableOE_tb$gene, grch38annot$ensgene)])

## Create an empty column to indicate which genes to label
res_tableOE_tb <- res_tableOE_tb %>% mutate(genelabels = "")

## Sort by padj values 
res_tableOE_tb <- res_tableOE_tb %>% arrange(padj)

## Populate the genelabels column with contents of the gene symbols column for the first 10 rows, i.e. the top 10 most significantly expressed genes
res_tableOE_tb$genelabels[1:10] <- as.character(res_tableOE_tb$symbol[1:10])

View(res_tableOE_tb)

接下来,我们像以前一样用 geom_text_repel() 的附加层绘制它,我们可以在其中指定我们刚刚创建的基因标签列。

ggplot(res_tableOE_tb, aes(x = log2FoldChange, y = -log10(padj))) +
    geom_point(aes(colour = threshold_OE)) +
    geom_text_repel(aes(label = genelabels)) +
    ggtitle("Mov10 overexpression") +
    xlab("log2 fold change") + 
    ylab("-log10 adjusted p-value") +
    theme(legend.position = "none",
          plot.title = element_text(size = rel(1.5), hjust = 0.5),
          axis.title = element_text(size = rel(1.25))) 
alt

欢迎Star -> 学习目录

更多教程 -> 学习目录


本文由 mdnice 多平台发布

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/96290.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【数电实验】移位寄存器与计数器

实验四 移位寄存器与计数器 一 实验目的 1 掌握任意进制计数器的构成方法&#xff1b; 2 熟悉双向移位寄存器的使用方法。 二 实验内容 1 任意进制计数器的构成方法&#xff1a; 用中规模集成计数器74HC161和与非门74LS00&#xff0c;构成十进制计数器。要求分别使用同步预…

精华推荐 | 【深入浅出RocketMQ原理及实战】「性能原理挖掘系列」透彻剖析贯穿RocketMQ的事务性消息的底层原理并在分析其实际开发场景

什么是事务消息 事务消息(Transactional Message)是指应用本地事务和发送消息操作可以被定义到全局事务中,要么同时成功,要么同时失败。RocketMQ的事务消息提供类似 X/Open XA 的分布事务功能,通过事务消息能达到分布式事务的最终一致。 事务消息所对应的场景 在一些对…

docker学习笔记(五)单个服务镜像部署

引言 当前微服务项目已经大面积普及&#xff0c;对于新需求迭代上线有许多疑惑的部分&#xff0c;比如线上的某些功能不能重启&#xff0c;在这种情况下我们需要部署和启动项目就不能搞大范围重启或干脆重新制作镜像&#xff0c;这种方式都是不可取的&#xff0c;这时候就需要…

重学webpack系列(二) -- webpack解决的问题与实现模块化的具体实践

只是根据几个想法&#xff0c;我们便创造出了webpack打包工具&#xff0c;它能够根据我们在前端项目中遇到的疑难杂症对症下药&#xff0c;那么这一章我们就一起来探讨一下我们项目落地所遇到的种种问题。 前端实践中的问题 Jsx / Tsx编译问题Less / Scss编译问题TypeScript编…

【Pintos】实现自定义 UserProg 系统调用 | 添加 syscall-nr 系统调用号 | 编写新的参数调用宏

&#x1f4ad; 写在前面&#xff1a;本文讲解的内容不属于 Pintos 的 Project 项目&#xff0c;而是关于 userprog 如何添加系统调用的&#xff0c;学习如何额外实现一些功能到系统调用中以供用户使用。因为涉及到 src/example 下的Makefile 的修改、lib 目录下 syscall-nr 系统…

门诊排队叫号系统,有序叫号就诊,适用医院医院、门诊部、诊所等

排队叫号系统&#xff0c;是将互联网信息技术与门诊预约、签到、提醒、叫号、接诊等环节相结合&#xff0c;实现门诊流程式便捷叫号服务。 为助力门诊营造一个良好有序的就诊环境&#xff0c;打造科学合理的就诊流程&#xff0c;今天给大家推荐一款一款便捷排队叫号系统&#x…

Linux基本权限(2)

Linux基本权限(2) &#x1f4df;作者主页&#xff1a;慢热的陕西人 &#x1f334;专栏链接&#xff1a;Linux &#x1f4e3;欢迎各位大佬&#x1f44d;点赞&#x1f525;关注&#x1f693;收藏&#xff0c;&#x1f349;留言 本博客主要讲解了目录权限&#xff0c;和目录&#…

2022年底,我手里一共负责了30套系统

2022年真是不平凡的一年&#xff0c;往常熙熙攘攘的办公室人越来越少&#xff0c;真是像曹操说的兄弟相继凋零&#xff0c;好似风中落叶啊。 结果人少了&#xff0c;手里的系统一个没少&#xff0c;慢慢年底了&#xff0c;我汇总了一下&#xff0c;手里的系统达到了30来个。 搞…

Linux--基础IO

目录 C文件IO 系统文件IO 接口介绍 系统调用和库函数 文件描述符 open返回值 文件描述符的分配规则 重定向 代码演示 使用dup2系统调用 缓冲区 FILE 理解文件系统 文件系统 inode 软硬链接 静态库和动态库 概念 生成静态库 生成动态库 C文件IO 写文件 #in…

SpringBoot+Prometheus+Grafana 实现自定义监控

1.Spring Boot 工程集成 Micrometer 1.1引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId> </dependency> <dependency><groupId>io.micrometer<…

E1. Erase and Extend (Easy Version)(纯暴力+string)

Problem - 1537E1 - Codeforces 这是该问题的简单版本。唯一的区别是对n和k的约束。只有当所有版本的问题都解决了&#xff0c;你才能进行黑客攻击。 你有一个字符串s&#xff0c;你可以对它进行两种类型的操作。 删除字符串的最后一个字符。 复制字符串&#xff1a;s:ss&…

数据结构---堆排序

堆排序JAVA实现和快速排序区别二叉堆的构建&#xff0c;删除&#xff0c;调整是实现堆排序的基础之前博客写了二叉堆&#xff1a; 二叉堆最大堆的堆顶是整个堆中的最大元素。最小堆的堆顶是整个堆中的最小元素。 堆排序步骤&#xff1a; 把无序数组构建成二叉堆。(需要从小到…

ArcGIS基础:等高线数据生成栅格DEM数据

以下操作为生成栅格DEM数据的方法。 一般方法是先创建TIN&#xff0c;然后在转为栅格DEM数据。 原始数据如下&#xff1a;为等高线数据&#xff0c;创建TIN数据需要用到等高线数据的【高程】字段。 声明&#xff1a;数据来源于网络。 工具位于【3D分析工具】下的【TIN】下…

BeanDefinition

1. 前言 Spring最重要的一个概念当属Bean了&#xff0c;我们写的Controller、Service、Dao凡是加了对应注解交给Spring管理的&#xff0c;都是Spring容器中的一个Bean。把我们自己写的类变成一个Bean交给Spring管理有很多的好处&#xff0c;比如我们不用自己去new对象了&#…

ssh+mysql实现的Java web企业人事人力资源管理系统源码+运行教程+参考论文+开题报告

今天给大家演示的是一款由sshmysql实现的Java web企业人事人力资源管理系统&#xff0c;其中struts版本是struts2&#xff0c;本系统功能非常完善&#xff0c;已经达到了可以商用的地步&#xff0c;基本全部实现了整个人力资源管理的所有功能&#xff0c;包括员工档案信息、部门…

jekins集成部署

jekins集成部署1.jekins简介2.Jenkins部署环境3. jekins安装4.配置jekins启动和停止脚本5.插件安装5.1.安装maven插件安装5.2 安装gitee插件5.3 安装Publish Over SSH插件5.4 安装 事件机制插件6.任务构建6.1 构建任务6.2 配置giteeApi令牌6.3 配置gitee源码地址6.4 在build中配…

3D激光里程计其二:NDT

3D激光里程计其二&#xff1a;NDT1. 经典NDT2. 计算方式2.1 2D场景求解:2.2 3D场景求解&#xff1a;3. 其他 NDTReference:深蓝学院-多传感器融合 1. 经典NDT NDT 核心思想&#xff1a;基于概率的匹配。目标是将点集 Y 匹配到固定的点集 X 中。这里的联合概率说的是将 X 划分成…

计算机毕业设计springboot+vue社区疫情防控系统

项目介绍 本系统运用最新的技术springboot框架,此框架是现在社会公司生产中所用的必需框架,非常实用,相比于以前的ssm框架,简单很多。前端框架运用vue框架,vue框架是最近几年非常流行的前端技术,适合很多开发语言。主要可以是系统的前端和后端进行解耦,分离,有利于开发者分别注…

设计模式——中介者模式

中介者模式一、基本思想二、应用场景三、结构图四、代码五、优缺点优点缺点一、基本思想 定义一个中介对象来封装一系列对象之间的交互&#xff0c;使原有对象之间的耦合松散&#xff0c;且可以独立地改变它们之间的交互。中介者模式又叫调停模式&#xff0c;它是迪米特法则的…

Proteus8仿真:51单片机LCD1602显示

51单片机LCD1602显示元器件原理图部分代码main.c工程文件元器件 元器件名称排阻RESPACK-851单片机AT89C51LCD1602LM016L按键BUTTON 原理图部分 LCD1602驱动: HD44780显示主要有8位操作8位两行显示&#xff0c;4位操作8位一行显示&#xff0c;8位操作8位一行显示。 LCD1602主要…