5.8.1
什么是ggplot2
ggplot2是由Hadley Wickham设计的R软件包,它有助于数据绘图。在本实验中,我们将简要介绍该软件包的一些功能。如果您想了解更多关于如何使用ggplot2的信息,我们建议您阅读Hadley Wickham撰写的“ggplot2 Elegant graphics for data analysis”。
5.8.2
ggplot2的原理
- 如果要使用ggplot2绘制数据,则数据必须是数据框。
- 使用
aes
映射函数来指定数据框中的变量如何映射到图上的要素 - 使用geoms来指定数据在图表中的表示方式,例如。散点图,条形图,箱形图等。
5.8.3
使用aes映射功能
该aes
函数指定数据框中的变量如何映射到绘图上的要素。要了解其工作原理,让我们看一个例子:
library(ggplot2)
library(tidyverse)
set.seed(1)
counts <- as.data.frame(matrix(rpois(100, lambda = 10), ncol=10, nrow=10))
Gene_ids <- paste("gene", 1:10, sep = "")
colnames(counts) <- paste("cell", 1:10, sep = "")
counts<-data.frame(Gene_ids, counts)
counts
代码语言:javascript复制## Gene_ids cell1 cell2 cell3 cell4 cell5 cell6 cell7 cell8 cell9 cell10
## 1 gene1 8 8 3 5 5 9 11 9 13 6
## 2 gene2 10 2 11 13 12 12 7 13 12 15
## 3 gene3 7 8 13 8 9 9 9 5 15 12
## 4 gene4 11 10 7 13 12 12 12 8 11 12
## 5 gene5 14 7 8 9 11 10 13 13 5 11
## 6 gene6 12 12 11 15 8 7 10 9 10 15
## 7 gene7 11 11 14 11 11 5 9 13 13 7
## 8 gene8 9 12 9 8 6 14 7 12 12 10
## 9 gene9 14 12 11 7 10 10 8 14 7 10
## 10 gene10 11 10 9 7 11 16 8 7 7 4
代码语言:javascript复制ggplot(data = counts, mapping = aes(x = cell1, y = cell2))
让我们仔细看看最后的命令,ggplot(data = counts, mapping = aes(x = cell1, y = cell2))
。ggplot()
初始化一个ggplot对象并获取参数data
和mapping
。我们将计数的数据框传递给data
并使用aes()
函数来指定将变量cell1用作x变量,而将变量cell2用作y变量。
任务1:修改上面的命令以初始化ggplot对象,其中cell10是x变量,cell8是y变量。
很明显,我们刚刚创建的图表信息量不大,因为它们上没有显示数据。要显示数据,我们需要使用geoms。
5.8.4
Geoms
我们可以使用geoms来指定我们希望数据在图表上显示的方式。例如,我们选择的geom可以指定我们的数据显示为散点图,条形图或箱形图。
让我们看看我们的图形怎样看起来像散点图。
代码语言:javascript复制ggplot(data = counts, mapping = aes(x = cell1, y = cell2)) geom_point()
现在我们可以看到,cell1和cell2中的基因表达之间似乎没有任何关联。鉴于我们counts
随机生成,这并不令人惊讶。
任务2:修改上面的命令以创建折线图。提示:执行?ggplot
并向下滚动帮助页面。底部是ggplot包索引的链接。滚动索引,找到geom选项。
5.8.5
从两个以上的细胞中绘制数据
到目前为止,我们一直在考虑数据框中2个细胞的基因数。但是我们的数据框中实际上有10个细胞,比较所有细胞会更好。如果我们想同时绘制来自所有10个细胞的数据怎么办?
目前我们不能这样做,因为我们将每个单独的细胞视为变量并将该变量分配给x轴或y轴。我们可以创建一个10维图来绘制来自所有10个细胞的数据,但这是a)不可能与ggplot b)不太容易解释。我们可以做的是整理我们的数据,以便我们有一个代表细胞ID的变量和另一个代表基因计数的变量,并将它们相互映射。在代码中,这看起来像:
代码语言:javascript复制counts<-gather(counts, colnames(counts)[2:11], key = 'Cell_ID', value='Counts')
head(counts)
代码语言:javascript复制## Gene_ids Cell_ID Counts
## 1 gene1 cell1 8
## 2 gene2 cell1 10
## 3 gene3 cell1 7
## 4 gene4 cell1 11
## 5 gene5 cell1 14
## 6 gene6 cell1 12
基本上,之前的问题是我们的数据不整齐,因为一个变量(Cell_ID)分布在多个列上。现在我们已经解决了这个问题,我们更容易在一个图上绘制来自所有10个细胞的数据。
代码语言:javascript复制ggplot(counts,aes(x=Cell_ID, y=Counts)) geom_boxplot()
任务3:使用更新的counts
数据框绘制条形图,其中Cell_ID为x变量,Counts为y变量。提示:您可能会发现阅读很有帮助?geom_bar
。
任务4:使用更新的counts
数据框绘制散点图,其中Gene_ids为x变量,Counts为y变量
5.8.6
绘制热图
可视化基因表达数据的常用方法是使用热图。在这里,我们将使用R包pheatmap
来执行此分析,并使用我们将命名为test
的一些基因表达数据作为测试数据。
library(pheatmap)
set.seed(2)
test = matrix(rnorm(200), 20, 10)
test[1:10, seq(1, 10, 2)] = test[1:10, seq(1, 10, 2)] 3
test[11:20, seq(2, 10, 2)] = test[11:20, seq(2, 10, 2)] 2
test[15:20, seq(2, 10, 2)] = test[15:20, seq(2, 10, 2)] 4
colnames(test) = paste("Cell", 1:10, sep = "")
rownames(test) = paste("Gene", 1:20, sep = "")
pheatmap(test)
让我们花一点时间来弄清楚这张图片向我们展示了什么。每行代表一个基因,每列代表一个细胞。每个细胞中每个基因的表达的程度由相应框的颜色表示。例如,我们可以从该图中看出,基因18在细胞10中高度表达,但在细胞1中低表达。
该图还为我们提供了有关聚类算法结果的信息。通常,聚类算法旨在将数据点(例如,细胞)分成其成员彼此更相似的组。在图的顶部和左侧绘制的树是聚类算法的结果,并使我们能够看到,例如,细胞4,8,2,6和10彼此更相似它们是相似的细胞7图表左侧的树表示应用于数据集中基因的聚类算法的结果。
如果我们仔细观察树,我们可以看到它们最终具有与细胞和基因相同数量的分支。换句话说,细胞聚类的总数与细胞总数相同,并且基因聚类的总数与基因的总数相同。显然,这不是非常有用的信息,当我们查看超过10个细胞和20个基因时,这将变得不切实际。幸运的是,我们可以设置我们在图上看到的聚类数量。让我们尝试将基因聚类的数量设置为2:
代码语言:javascript复制pheatmap(test, kmeans_k = 2)
现在我们可以看到这些基因分为两个类 - 一组8个基因在细胞2,10,6,4和8中相对于其他细胞upregulated ,2,10,6,4,8相对于其他细胞downregulated在细胞中下调。
任务5:尝试将群集数量设置为3.您认为哪个群集数量更具信息量?
5.8.7
主成分分析
主成分分析(PCA)是一种统计过程,它使用变换,将一组观察值转换为一组称为主成分的线性不相关变量值。通过转换,使得第一主成分尽可能地考虑数据的可变性,并且每个后续主成分考虑了在必须与先前成分正交的约束下可能的最大方差量。
PCA图是获取数据概览的好方法,有时可以帮助识别解释数据中大量可变性的混杂因素。我们将研究如何在未来的实验室中更深入地使用单细胞RNA-seq分析中的PCA图,这里的目的是让您大概了解PCA图是什么以及它们是如何生成的。
让我们为我们的test数据制作一个PCA图。我们可以使用这个ggfortify包让ggplot知道如何解释主要成分。
代码语言:javascript复制library(ggfortify)
Principle_Components<-prcomp(test)
autoplot(Principle_Components, label=TRUE)
任务6:将你的聚类与pheatmap聚类进行比较。它们有关系吗?(提示:看看我们绘制的第一个pheatmap图的基因树)
任务7:为counts
(下方)生成热图和PCA图:
set.seed(1)
counts <- as.data.frame(matrix(rpois(100, lambda = 10), ncol=10, nrow=10))
rownames(counts) <- paste("gene", 1:10, sep = "")
colnames(counts) <- paste("cell", 1:10, sep = "")