此推文所有ppt截图和大部分代码来自生信技能树的小王老师
我们都说R语言是用来处理数据的,然而不管是什么样的数据,我们处理完之后肯定都是要展示给别人看的,而人类是视觉的动物,不然哪来那么多颜控(不是)。
所以在处理完数据之后我们需要把我们的结果或者发现可视化,以此来帮助读者理解或者避免可能的歧义,而很巧的是R语言自己就有这个功能。
相比于很多结构、配色、层级等都已被明确的图形软件,R语言的可视化功能更为灵活和强大,可以根据数据的特点和需求进行定制化的绘图,而第三方R包的引入可以无限放大这个优势。
R语言的可视化功能主要分为三大体系:基础包(base graphics)、ggplot2和lattice。每个体系都有其独特的语法和风格,适用于不同的绘图需求。
首先来看基础包 (base graphics)的一个例子 这个已经略微古墓派了,了解即可:
基础包示例
p0 <- plot( x = iris$Sepal.Length, y = iris$Petal.Length, col = iris$Species, # 按物种着色 pch = 16, # 实心圆点 cex = 1.2, # 点大小 xlab = "Sepal Length (cm)", # x轴标签 ylab = "Petal Length (cm)", # y轴标签 main = "Base Plot: Iris Dataset"# 标题 )# 添加图例 legend("topleft", legend = levels(iris$Species), col = 1:3, pch = 16, bty = "n" )# 添加文本标注 text(6.5, 4, labels = "Hello R!", cex = 1.5, font = 2) dev.off()
我们可以看到,基础包的绘图语法相对直接,但在复杂图形的定制化方面可能需要更多的代码和调整。 而基础包又分为高级函数和低级函数,低级函数的功能依赖高级函数而存在:
接下来是ggplot2的例子:
ggplot2示例
library(ggplot2)# 基础散点图ggplot(data = iris, aes(x = Sepal.Length, y = Petal.Length, color = Species)) + geom_point(size = 3, alpha = 0.7) + # 点的大小和透明度 labs( title = "ggplot2: Iris Sepal vs Petal Length", subtitle = "Colored by Species", x = "Sepal Length (cm)", y = "Petal Length (cm)", color = "Species" ) + theme_minimal() + # 简洁主题 theme( plot.title = element_text(hjust = 0.5, size = 14, face = "bold"), plot.subtitle = element_text(hjust = 0.5) )
可以看到,ggplot2采用了分层的语法结构,允许我们通过添加不同的图层(如点图、线图、文本等)来构建复杂的图形,同时提供了丰富的主题和美学选项来定制图形的外观。这样就相对公式化,更适合去微调参数或者去效仿已经成功的案例。
ggplot2的语法有点像一层一层盖房子,以下是一个通用语法规则:
这就类似于一种以数据为地基,在这个基础上整各种花活的操作,接下来我将以一系列案例的迭代阐述之.
library(ggplot2) ggplot(data = iris) + geom_point(mapping = aes(x = Sepal.Length, y = Petal.Length))
ggplot(data = iris) + geom_point(mapping = aes(x = Sepal.Length, y = Petal.Length), color = "purple") #我设置成紫色
ggplot(data = iris) + geom_point( mapping = aes(x = Sepal.Length, y = Petal.Length), size = 5, # 点的大小5mm alpha = 0.5, # 透明度 50% shape = 8 ) # 点的形状
这里我以iris数据集中的Species来给颜色做定义
ggplot(data = iris) + geom_point(mapping = aes(x = Sepal.Length, y = Petal.Length, color = Species))
Q1 两个color参数分别是哪个函数的参数,它们又各自应该取什么值呢?
A1: 分别是geom_point()和aes()函数的参数,前者应该输入一种具体的颜色(颜色的英文单词或者十六进制码),而后者应该取数据中的某一列。
Q2 能不能自行指定映射的具体颜色?
A2:可以的可以的,可以通过scale_color_manual函数来做到()
ggplot(data = iris) + geom_point( mapping = aes(x = Sepal.Length, y = Petal.Length, color = Species) ) + scale_color_manual(values = c("blue", "grey", "red"))
那这个时候就有人要问了,主播主播,我觉得这个颜色很接近我想要的了,但总感觉有一点偏差该怎么办 这个时候可以通过十六进制颜色编码来指定颜色,十六进制颜色编码是由#开头,后面跟着六位数字或字母的字符串,每两位表示红、绿、蓝三种颜色的强度。例如,#2874C5表示一种蓝色,#e6b707表示一种黄色,#f87669表示一种红色。
ggplot(data = iris) + geom_point( mapping = aes(x = Sepal.Length, y = Petal.Length, color = Species) ) + scale_color_manual(values = c("#2874C5", "#e6b707", "#f87669"))
那如果我自己太懒不想自己去一个个找颜色该咋办? 这里力推paletteer,集成多个配色的R包,两千多种选择
library(paletteer) ggplot(data = iris) + geom_point( mapping = aes(x = Sepal.Length, y = Petal.Length, color = Species) ) + scale_color_paletteer_d("awtools::mpalette")
可以通过View(palettes_d_names)函数来看里面的配色方案 这里给一个轮廓:
head(palettes_d_names)# A tibble: 6 × 5 package palette length type novelty <chr> <chr> <int> <chr> <lgl> 1 amerika Dem_Ind_Rep3 3 divergent FALSE 2 amerika Dem_Ind_Rep5 5 divergent FALSE 3 amerika Dem_Ind_Rep7 7 divergent FALSE 4 amerika Democrat 3 sequential FALSE 5 amerika Republican 3 sequential FALSE 6 awtools a_palette 8 sequential TRUE它很友好地告诉了你每个方案的包来源、名字、颜色数、离散或连续等信息。
区分color和fill两个属性
空心形状和实心形状都用color设置颜色
ggplot(data = iris) + geom_point( mapping = aes(x = Sepal.Length, y = Petal.Length, color = Species), shape = 17 ) #17号,实心的例子
ggplot(data = iris) + geom_point( mapping = aes(x = Sepal.Length, y = Petal.Length, color = Species), shape = 2 ) #2号,空心的例子
既有边框又有内心的,才需要color和fill两个参数
ggplot(data = iris) + geom_point( mapping = aes(x = Sepal.Length, y = Petal.Length), shape = 24, color = "red", fill = "yellow" ) #24号,双色的例子
几何对象指的是每个函数画出来的所有东西,比如geom_point()画出来的点,geom_smooth()画出来的线和阴影,geom_boxplot()画出来的箱线图等等。 几何对象是可以叠加的,也就是我们说的在数据地基上一点点盖房子的过程 我们可以对每一个对象做不同的设置,也可以全局一盘棋一次设置完,以下是一对例子
ggplot(data = iris) + geom_smooth(mapping = aes(x = Sepal.Length, y = Petal.Length)) + #局部设置 geom_point(mapping = aes(x = Sepal.Length, y = Petal.Length)) #局部设置
ggplot(data = iris, mapping = aes(x = Sepal.Length, y = Petal.Length)) + geom_smooth() + geom_point() #全局设置
# 抖动的点图 ggplot( data = iris, mapping = aes(x = Species, y = Sepal.Width, fill = Species) ) + geom_boxplot() + geom_point()
ggplot( data = iris, mapping = aes(x = Species, y = Sepal.Width, fill = Species) ) + geom_boxplot() + geom_point(position = "jitter") 
ggplot( data = iris, mapping = aes(x = Species, y = Sepal.Width, fill = Species) ) + geom_boxplot() + geom_jitter() + coord_flip() #颠倒x和y轴
ggplot2中提供了多种主题:
而主题中的每一个参数都是可以去调试的 !

我们可以用theme()函数来控制所有的视觉元素:

ggplot2的一切过程都可以用这张图来说明:
这里面的其中四个层在前文中已经探讨,现在我们来讨论分面层和刻度层
分面层是用来拆子图的
实际例子:比如我们原来有一张图
ggplot( data = iris, mapping = aes(x = Species, y = Sepal.Width, fill = Species) ) + geom_boxplot() + geom_point(position = "jitter") 
我们可以通过facet_wrap()函数来把它拆开
ggplot( data = iris, mapping = aes(x = Species, y = Sepal.Width, fill = Species) ) + geom_boxplot() + geom_point(position = "jitter") + facet_wrap(~Species, ncol=3, scales="free_x")
至于刻度层,它具体规定映射是如何进行的:
像前文中设置颜色的例子就用它规定了映射了哪些颜色
最基础的图片保存过程,ggplot2也可以用,如图:
以下是两个案例:
#基础包作图的保存 pdf("iris_box_ggpubr.pdf") ggplot(iris, aes(x = Species, y = Sepal.Length, fill = Species)) + geom_boxplot() dev.off()#2.ggplot系列图(包括ggpubr)通用的简便保存 ggsave library(ggplot2) p <- ggplot(iris, aes(x = Species, y = Sepal.Length, fill = Species)) + geom_boxplot() ggsave(p, filename = "iris_box_ggpubr.png")这个是ggplot推荐的导出函数,不需要三段式保存:
如何快速学习函数的参数
可以使用patchwork包,相关的用法附上:

我认为这张图还是很好地说明了核心思路,虚心学习ing.
这篇推文是以上课的内容为蓝本,我在这个基础上整理了一下并进行了改写,在此感谢生信技能树的小王老师!!! 也很感谢你阅读到这里 By鼠鼠