https://hbctraining.github.io/Intro-to-R/lessons/07_ggplot2.html
学习目标
- 使用扩展包“ggplot2”绘制图表。
- 使用“map”函数进行数据结构迭代。
- 导出在R环境之外使用的图片。
1.设置数据框以进行可视化
在本课中需要制作与每个样本中的平均表达量相关的多个图,还需要使用所有可用的metadata来适当地注释图表。
观察rpkm数据。每列代表实验中的样品,每个样品具有~38K值,对应着不同转录本的表达。最终需计算每个样本的表达量的平均值。一步一步来,如果只想要样本1的平均表达式(包括所有转录本),怎么做?使用R base包提供的函数'mean()`:
mean(rpkm_ordered[,"sample1"])
只想要其中一个样本(数据框中的1列)的平均值,可以这样实现,但要从所有12个样本中获取此信息该如何实现?
编程语言通常有办法允许多次执行代码,或者在“循环”中执行。虽然R语言也有“循环”,但有些函数更直接,例如apply()
函数map()
族和函数族。map()
族比apply()
更直观,因此主要学习map()
。想学更多更多内容,可以使用apply()
函数的资料(https://hbctraining.github.io/Intro-to-R/lessons/apply_functions.html)。
2. map
系列函数
purrr
包map()
提供了一系列函数,它是tidyverse中的一个包。参阅R for Data Science一书。该族包括几个函数,每个函数的输入都是向量,输出是指定类型的向量。例如,用这些函数对向量中的每个元素或数据框中的每列或列表的每个组件执行某些任务/函数,依此类推。
-
map()
创建一个列表。 -
map_lgl()
创建一个逻辑向量。 -
map_int()
创建一个整数向量。 -
map_dbl()
创建一个“双”或数字向量。 -
map_chr()
创建一个字符向量。
map()
函数族的语法是:
## DO NOT RUN
map(object, function_to_apply)
想练习map()
一系列功能,参考(https://hbctraining.github.io/Intro-to-R/lessons/map_purrr.html)。
3.用map_dbl()
处理数据
为了获得所有样本的平均值,可以使用用生成数字向量的函数map_dbl()
。
library(purrr) # Load the purrr
samplemeans <- map_dbl(rpkm_ordered, mean)
可以将这个包含的12个元素的向量作为一列,添加到metadata数据框中,从而将平均表达量与实验metadata相结合。cbind()
或“rbind()”函数可以实现。
new_metadata <- cbind(metadata, samplemeans)
开始绘图之前,再给metadata添加一列new_metadata
,内容是每个老鼠样本的日龄。
age_in_days <- c(40, 32, 38, 35, 41, 32, 34, 26, 28, 28, 30, 32)
# Create a numeric vector with ages. Note that there are 12 elements here.
new_metadata <- cbind(new_metadata, age_in_days)
# add the new vector as the last column to the new_metadata dataframe
准备好了,进行绘图和数据可视化!
4.数据可视化与 ggplot2
处理大数据时,以图片的形式显示信息更有效。可视化应该有自己的整个过程(有很多要知道!)。如果你有兴趣了解基本R功能的绘图,查看课程(https://hbctraining.github.io/Intro-to-R/lessons/basic_plots_in_r.html)。在本课中主要学习ggplot2
绘图。
基础包绘图应用越来越少,因为ggplot2
与基本R绘图函数相比功能更强大。ggplot2
语法需要一些时间来适应,但一旦学会,会发现它非常强大、灵活。我们将从new_metadata
数据框为例,绘制的一个samplemeans
和age_in_days
的散点图,。ggplot2
默认输入是数据框。
加载ggplot2
,它是tidyverse
包的一部分。
library(ggplot2)
ggplot()
函数用于初始化基本图形结构。基本思想是指定绘图的不同部分,并使用+
运算符将它们添加到一起。这些部分称为图层。
开始吧:
ggplot(new_metadata) # what happens?
你会得到一个空白图,需要使用运算符指定图层+
。
几何对象是图层的一种。是在图上添加的具体图形。例子包括:
- 点(
geom_point
,geom_jitter
为散点图,散点图等) - 线(
geom_line
,时间序列,趋势线等) - 箱线图(
geom_boxplot
)
所有几何对象的详细列表及使用场景,请查看Hadley Wickham的RPubs(http://rpubs.com/hadley/ggplot2-layers)或RStudio 的cheetsheat(http://rpubs.com/hadley/ggplot2-layers)。
图必须至少有一个geom
; 没有上限。用+
运算符向图上添加geom
ggplot(new_metadata) +
geom_point() # note what happens here
即使添加一个图层geom_point
,也会报错。这是因为每种类型的geom通常都具有一组必需的映射。映射使用aes()函数设置,并且可以在geom_point()
内部设置以专门应用于该层。如果我们在ggplot()
中提供映射,它们将被用作每个图层的默认值。映射的例子包括:
- 位置(即在x和y轴上)
- 颜色(“外部”颜色)
- 填充(“内部”颜色)
- 形状(点数)
- 线型
- 尺寸
首先,必须添加x轴和y轴的位置,因为geom_point
需要有关散点图的最基本信息,即要在x和y轴上绘制的内容。上面提到的所有其他例子都是可选的。
ggplot(new_metadata) +
geom_point(aes(x = age_in_days, y= samplemeans))
ggscatter1
有了必须的映射,再为图片添加一些可选的映射,比如颜色。通过指定列标题来,按照基因型给点上色。自动使用一组默认颜色,不必指定。此外,ggplot2还自动绘制了图例!
ggplot(new_metadata) +
geom_point(aes(x = age_in_days, y= samplemeans, color = genotype))
ggscatter1.1
也可以基于细胞类型进行着色color =celltype
。尝试不同的东西,在图上同时显示细胞类型和基因型。为此,我们可以为列标题指定shape
映射,不同形状表示不同的celltype。添加shape = celltype
,看图发生什么改变:
ggplot(new_metadata) +
geom_point(aes(x = age_in_days, y= samplemeans, color = genotype,
shape=celltype))
ggscatter3
数据点的尺寸非常小。可以调整geom_point()
的大小,但并不需要列入aes()
,因为是指定点的大小,而不是将其映射到一个变量。添加size
参数,用数字指定点的大小:
ggplot(new_metadata) +
geom_point(aes(x = age_in_days, y= samplemeans, color = genotype,
shape=celltype), size=3.0)
ggscatter4
x轴和y轴上的标签也很小,难以阅读。要更改其大小,需要添加其他主题图层。ggplot2 theme
系统处理非数据绘图元素,例如:
- 坐标轴标签映射
- 图片背景
- 标签背景
- 图例外观
可以使用内置主题(即theme_bw()
),通过将其添加为附加层,主要更改背景/前景色。或者通过添加theme()
图层并传入我们希望更改的内容的参数来调整当前默认主题的特定元素。也可以两者都用。
添加一个图层theme_bw()
。通过更改theme,观察轴标签或刻度标签是否会变大?
ggplot(new_metadata) +
geom_point(aes(x = age_in_days, y= samplemeans, color = genotype,
shape=celltype), size=3.0) +
theme_bw()
不能。但可以添加参数theme()
手动改变它。由于我们将此图层添加到最上层(即代码的最后),因此更改的任何细节都会覆盖在theme_bw()
中的设置的。在这里,将轴标签和轴刻度标签的大小增加到默认大小的1.5倍。修改文本大小使用rel()
函数。指定的大小是相对于默认值(类似于基础绘图cex
)。也可以像设置点大小一样使用数字,但如果不知道默认字体大小,则会很麻烦。
ggplot(new_metadata) +
geom_point(aes(x = age_in_days, y= samplemeans, color = genotype,
shape=celltype), size=3.0) +
theme_bw() +
theme(axis.text = element_text(size=rel(1.5)),
axis.title = element_text(size=rel(1.5)))
ggscatter5
注意:可以使用
example("geom_point")
来探索可添加到绘图中的众多不同的映射和图层。滚动浏览不同的图,记住代码的修改方式。可以将它与ggplot2中可用的任何不同几何对象图层一起使用,轻松学习修改图形!
注意: RStudio提供了非常有用的cheatsheet(https://www.rstudio.com/wp-content/uploads/2016/11/ggplot2-cheatsheet-2.1.pdf)用于使用
ggplot2
绘图。提供了不同的示例图和相关代码(geom
或theme
的代码)。
练习
- 当前坐标轴标签文本默认为
geom_point
的输入内容(即列标题)。添加图层xlab()
和ylab()
,改变x轴和y轴的标签。将这些图层添加到当前图中,x轴标记为“年龄(天)”,y轴标记为“平均表达量”。 - 使用
ggtitle
图层为绘图添加标题。注意:可以用代码将标题置于图中央位置theme(plot.title=element_text(hjust=0.5))
。
5.使用自定义函数进行一致的格式设置
确保文章中所有图片格式风格相似是很有必要的。为此,可以创建函数来自定义主题。自定义函数的语法结构是:
name_of_function <- function(arguments) {
statements or code that does something
}
现在,设置包含以下内容的主题:
theme_bw() +
theme(axis.text=element_text(size=rel(1.5)),
axis.title=element_text(size=rel(1.5)),
plot.title=element_text(hjust=0.5))
如果运行后没有任何想要修改的地方,就不需要指定任何参数。创建函数很简单; 我们可以把代码放在{}
:
personal_theme <- function(){
theme_bw() +
theme(axis.text=element_text(size=rel(1.5)),
axis.title=element_text(size=rel(1.5)),
plot.title=element_text(hjust=0.5))
}
现在需要为任何图片添加主题,都可以用这个函数代替theme()
代码:
ggplot(new_metadata) +
geom_point(aes(x=age_in_days, y=samplemeans, color=genotype, shape=celltype), size=rel(3.0)) +
personal_theme() +
xlab("Age (days)") +
ylab("Mean expression") +
ggtitle("Expression with Age")
6.箱线图
已经有了用ggplot2进行绘图所需的所有信息,可以尝试绘制一个箱线图。箱形图提供了基于五分位数的数据分布图。框的顶部和底部代表第一和第三个四分位数(分别为25%和75%)。框内的线代表中位数(50%)。在框的上方和下方延伸到的点代表数据集的最大值和最小值。图的直线达到的点是除异常值外的最小值和最大值。
使用四分位值(IQR)确定异常值,IQR定义为:Q3-Q1。低于Q1或高于Q3超过1.5 x IQR的任何值都被视为异常值,并表示为竖线上方或下方的点。这些异常值表示意外的观察结果。
- 使用
geom_boxplot()
图来绘制Wt和KO基因型之间样本均值的差异。 - 给图添加标题。
- 以'Genotype'作为x轴标签,'Mean expression'为y轴标签。
- 将轴标签的大小更改为默认值的1.5倍。
- 将轴文本的大小(刻度线上的标签)更改为比默认值大1.25倍。
- 以与更改轴文本大小相同的方式更改绘图标题的大小,使用
plot.title
。
提示:使用fill
映射来观察每种基因型中细胞类型之间样本均值的差异。
最终图片看起来应该如下所示。
ggbox注意:如果要更改这些箱线图的颜色,
scale_fill_manual()
可以在代码中添加另一个图层,并在函数中使用values
参数指定要使用的颜色。例如,如果要着色的因子列具有2个级别,则需要提供2个值,如下所示scale_fill_manual(values=c("purple","orange"))
。注意:不限于上面指定的颜色,你可以使用十六进制代码选择许多颜色,获取有关R中调色板的更多信息:http://www.cookbook-r.com/Graphs/Colors_(ggplot2)/。
7. 将图片导出到文件
有两种方法可以将图输出到文件中(而不是简单地在屏幕上显示)。第一种(也是最简单的)是直接从RStudio“Plots”面板导出,点击绘图面板上方的Export
。R提供选择png
或pdf
等格式,选择要存放图片的目录。还提供了决定输出图像大小和分辨率的选项。
第二种方法是使用R函数并将写入文件编码到脚本中。这种方法允许用户从头到尾运行脚本并自动执行该过程(不需要人工点击操作来保存)。在R的术语中,输出被定向到特定的输出设备,并指示输出文件的格式。必须创建或“打开”设备才能接收图像输出,对于在磁盘上创建文件的设备,还必须关闭设备才能完成输出。
将散点图输出成pdf文件格式。首先,你需要使用一个函数,指定希望创建的图形格式(初始化),例如pdf()
,png()
,tiff()
等等。再函数内部为你的图像指定名称,宽度和高度(可选)。这将打开要写入的设备:
pdf("figures/scatterplot.pdf")
如果要修改图像的大小和分辨率,则需要在初始化时将相应的参数作为参数添加到函数中。然后我们使用刚刚创建的ggplot散点图将图像绘制到设备上。
ggplot(new_metadata) +
geom_point(aes(x = age_in_days, y= samplemeans, color = genotype,
shape=celltype), size=rel(3.0))
最后,使用dev.off()
函数关闭“设备”或文件。还有bmp
,tiff
和jpeg
函数,虽然JPEG函数已被证明与其他函数相比不太稳定。
dev.off()
注意1: 在执行dev.off()
函数之前,将无法使用标准方法(Adobe Acrobat或Preview等)打开和查看文件。
注2: 如果在关闭设备之前已经制作了任何其他图表,它们将全部存储在同一个文件中; 除非另有说明,否则每个图通常都会有自己的页面。
网友评论