ggplot2教程,从入门到精通(一)

学术   健康   2025-01-18 00:06   上海  

数据清洗中的10个高频操作!

2024-12-11

纯生信适合入门,高阶生信分析和数据挖掘仍需要 R 语言或 Python。为此我们不断完善教程,相继推出了纯生信21天,R 语言21天和单细胞21天。但是,数据处理的核心部分并没有变,数据清洗+数据可视化!前面分享了数据清洗 tidyverse 包中的10个高频操作,接下来,我们重点分享 ggplot2 包中的理论和实操!

与tidyverse包一样,ggplot2包也出自大神 Hadley Wickham之手。ggplot绘图要指定四样东西:数据集+几何图形+美学映射+统计转换。与传统的绘图命令相比,ggplot2更注重数据与图形之间的映射关系作为一款强大的绘图工具,ggplot2名字中的“gg”来源于“Grammar of Graphics”。这一理念彻底打破了传统绘图的局限和舒服,将绘图看作是一种语言,通过组合不同的元素和规则,构建出千变万化的图形。
# 映射的相关参数,榴莲整理,特此感谢!aes()函数中常见的映射选项是:    x和y:用于指定x轴和y轴映射的变量    color:映射点或线的颜色    fill:映射填充区域的颜色    linetype:映射图形的线形(1=实线、2=虚线、3=点、4=点破折号、5=长破折号、6=双破折号)    size:点的尺寸和线的宽度    shape:映射点的形状
美学映射 (aesthetics) 是几何或者统计对象的美学,可将变量映射给 x、y 坐标轴,或者映射给颜色、大小、形状等图形属性;几何对象 (geometry) 包括各种几何形状,如柱形图、直方图、散点图、线图、密度图等。统计变换(statistics):画图过程中,原始数据集往往要经过转换(transformation),这时添加图层的另一种方式是使用stat_*() 函数。统计变换是可选的,但往往非常有用。以下来自生信天地公众号,个人认为是针对ggplot非常好的解读https://mp.weixin.qq.com/s/9UcZRKDe0pfh3ViJ3okC4g
geom函数:多样的几何图形

在ggplot2中,geom_***()系列函数是绘制各种图形的基础。这些函数通过几何形状,将数据转化为可视化图形。其中提供50多种图形类型,选择时要依据数据变量的类型而定。比如geom_point()散点图,主要用于探究两个变量之间的关系。geom_bar()条形图以及geom_histogram()直方图用于展示分类变量的分布和频率。geom_boxplot()箱线图多用于展示数据的分布、中位数、四分位数以及异常值等信息。geom_line()折线图用于探究数据的变化趋势。
aes()函数:美学的映射魔法

aes()函数是建立数据与图形属性之间映射关系的关键。通过这个函数,用户可以将数据中的变量映射到图形的颜色、大小、形状等属性上。这种映射不仅可以根据数据的分布自动调整图形的样式,还可以通过设定特定的映射规则,突出数据中的特定信息。
主题与配色:多彩的视觉体验

除了基本的绘图功能和美学映射外,ggplot2还提供了丰富的主题和配色选项,让用户可以轻松地定制图形的视觉效果。theme()函数用于设定图形主题的命令,通过调整主题中的各种参数,如背景颜色、字体大小、网格线样式等。而scale_color_manual()函数和scale_colour_gradient()函数等则提供了丰富的配色选项。无论是离散型的配色方案还是连续型的渐变色方案,都可以轻松实现。
高级技巧:震撼的视觉效果

除了基础功能和美学定制外,ggplot2还提供了一系列高级技巧,达到震撼的视觉效果。例如,geom_hline()和geom_vline()函数可以用于在图形中添加水平和垂直的参考线,帮助用户更好地理解数据的分布和趋势。geom_errbar()函数可以用于添加误差线,展示数据的不确定性和变异范围。

2019年7 月,在国际统计学年会上,Hadley Wickham获得当年的考普斯会长奖,以表彰他在统计应用领域做出的卓越贡献。考普斯会长奖是由统计学会会长委员会颁发的奖项,被誉为统计届的诺贝尔奖,每年颁发一次,授予在统计学领域作出杰出贡献的青年学者。这是自1981年 COPSS 奖设立以来,统计软件工作者首次获奖,意义非凡(榴莲整理)。
## 加载包和数据
library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr 1.1.4 ✔ readr 2.1.5
## ✔ forcats 1.0.0 ✔ stringr 1.5.1
## ✔ ggplot2 3.5.1 ✔ tibble 3.2.1
## ✔ lubridate 1.9.4 ✔ tidyr 1.3.1
## ✔ purrr 1.0.2
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag() masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(ggplot2)

load(file = "test.rds")

## 基本绘图

(g <- ggplot(exprSet1, aes(x = GSM180994, y = GSM180995)))

g + geom_point()

g + geom_line()

g + geom_line() + geom_point()

# 调整几何图形的属性
g + geom_point(color = "firebrick", shape = "diamond", size = 2)

g + geom_point(color = "firebrick", shape = "diamond", size = 2) +
geom_line(color = "firebrick", linetype = "dotted", lwd = .3)

# 替换默认的ggplot2主题
theme_set(theme_bw())
g + geom_point(color = "firebrick")

## 调整坐标轴
# 修改title
ggplot(exprSet1, aes(x = GSM180994, y = GSM180995)) +
geom_point(color = "firebrick") +
labs(x = "Sample No.1", y = "Sample No.2")

ggplot(exprSet1, aes(x = GSM180994, y = GSM180995)) +
geom_point(color = "firebrick") +
labs(x = "Sample NO.1", y = expression(paste("Sample NO.2"^"(Hey, why should we use metric units?!)")))

# 增加轴和轴标题之间的空间
ggplot(exprSet1, aes(x = GSM180994, y = GSM180995)) +
geom_point(color = "firebrick") +
labs(x = "Sample No.1", y = "Sample No.2") +
theme(axis.title.x = element_text(vjust = 0, size = 15),
axis.title.y = element_text(vjust = 2, size = 15))

ggplot(exprSet1, aes(x = GSM180994, y = GSM180995)) +
geom_point(color = "firebrick") +
labs(x = "Sample No.1", y = "Sample No.2") +
theme(axis.title.x = element_text(margin = margin(t = 10), size = 15),
axis.title.y = element_text(margin = margin(r = 10), size = 15))

# 改变轴标题的美学
ggplot(exprSet1, aes(x = GSM180994, y = GSM180995)) +
geom_point(color = "firebrick") +
labs(x = "Sample No.1", y = "Sample No.2") +
theme(axis.title = element_text(size = 15, color = "firebrick",
face = "italic"))

# face参数可用于使字体加粗或倾斜
ggplot(exprSet1, aes(x = GSM180994, y = GSM180995)) +
geom_point(color = "firebrick") +
labs(x = "Sample No.1", y = "Sample No.2") +
theme(axis.title.x = element_text(color = "sienna", size = 15),
axis.title.y = element_text(color = "orangered", size = 15))

# 调整坐标轴文本美学
ggplot(exprSet1, aes(x = GSM180994, y = GSM180995)) +
geom_point(color = "firebrick") +
labs(x = "Sample No.1", y = "Sample No.2") +
theme(axis.text = element_text(color = "dodgerblue", size = 12),
axis.text.x = element_text(face = "italic"))

# 旋转坐标轴文本
ggplot(exprSet1, aes(x = GSM180994, y = GSM180995)) +
geom_point(color = "firebrick") +
labs(x = "Sample No.1", y = "Sample No.2") +
theme(axis.text.x = element_text(angle = 30, vjust = 0, hjust = 1, size = 12))

# 删除坐标轴标题
ggplot(exprSet1, aes(x = GSM180994, y = GSM180995)) +
geom_point(color = "firebrick") +
labs(x = "Sample No.1", y = "Sample No.2") +
labs(x = NULL, y = "")

# 限制坐标轴范围
ggplot(exprSet1, aes(x = GSM180994, y = GSM180995)) +
geom_point(color = "firebrick") +
labs(x = "Sample No.1", y = "Sample No.2") +
ylim(c(0, 15))

# 可以使用scale_y_continuous(limits = c(0,15))或coord_cartesian(ylim = c(0,15))

# 使图表从坐标原点开始
ggplot(exprSet1, aes(x = GSM180994, y = GSM180995)) +
geom_point(color = "firebrick") +
labs(x = "Sample No.1", y = "Sample No.2") +
expand_limits(x = 0, y = 0)

# 相同比例的坐标轴
ggplot(exprSet1, aes(x = GSM180994, y = GSM180995)) +
geom_point(color = "firebrick") +
labs(x = "Sample No.1", y = "Sample No.2") +
xlim(c(0, 15)) + ylim(c(0, 15)) +
coord_fixed()

# 使用函数调整标签
ggplot(exprSet1, aes(x = GSM180994, y = GSM180995)) +
geom_point(color = "firebrick") +
labs(x = "Year", y = NULL) +
scale_y_continuous(label = function(x) {return(paste(x, "Expression"))})

参考资料:

  1. https://mp.weixin.qq.com/s/9UcZRKDe0pfh3ViJ3okC4g

  2. https://zhuanlan.zhihu.com/p/370223674

  3. 大神的博客:https://hadley.nz/

  4. https://blog.csdn.net/huangmingleiluo/article/details/104192128

  5. https://blog.csdn.net/weixin_45331620/article/details/106622445

芒果师兄
1.生信技能和基因编辑。2.论文发表和基金写作。3. 健康管理和医学科研资讯。4.幸福之路,读书,音乐和娱乐。
 最新文章