玩转数据可视化之R语言ggplot2:(三)ggplot2实现将多张图放在一起,包括并排和插图绘制(快速入门)
玩转数据可视化之R语言ggplot2
- 🌸个人主页:JoJo的数据分析历险记
- 📝个人介绍:小编大四统计在读,目前保研到统计学top3高校继续攻读统计研究生
- 💌如果文章对你有帮助,欢迎关注、点赞、收藏、订阅专栏
本系列主要介绍R语言ggplot2的使用
参考资料:
ggplot2: Elegant Graphics for Data Analysis
文章目录
💘3.将多张图形放在一起:包括并排绘制和插图
ggplot2默认的语法都是将每张图单独的放在一个画布中。即使上一章我们介绍的分面绘图给出了将多个子图画在同一个画布中,
但是都是用同一个数据集,针对同一类图形绘图。然而在实际应用中,我们往往需要对不同数据集的图进行比较分析。此时需要将多个不同的图画在同一个画布中,有很多相关库可以实现相应的需求,这里我们介绍patchwork库的使用。
我们主要讨论两个问题:
- 1.将多个图并排排列,放在同一个画布当中,相互之间没有重叠
- 2.将其中的一些图放到另一个图当中,有重叠部分。
🌍3.1 并排绘图
有时候,我们希望通过不同的图来显示我们研究问题的不同方面。
patchwork就是一个ggplot2的拓展包,通过+
连接不同的图。下面我们以mpg
数据集为例,展现patchwork最基本的应用
# 导入库
library(ggplot2)
library(dplyr)
p1 <- ggplot(mpg) +
geom_point(aes(x = displ, y = hwy))
p2 <- ggplot(mpg) +
geom_bar(aes(x = as.character(year), fill = drv), position = "dodge") +
labs(x = "year")
p3 <- ggplot(mpg) +
geom_density(aes(x = hwy, fill = drv), colour = NA) +
facet_grid(rows = vars(drv))
p4 <- ggplot(mpg) +
stat_summary(aes(x = drv, y = hwy, fill = drv), geom = "col", fun.data = mean_se) +
stat_summary(aes(x = drv, y = hwy), geom = "errorbar", fun.data = mean_se, width = 0.5)
patchwork最简单的使用就是通过+
来将两个图放在一起
library(patchwork)
p1 + p2
+
不会指定任何特定布局,只会默认的把图画在一起。在没有像和在facet_wrap()中控制行数和列数的参数那样,这意味着将3个图添加在一起将创建一个1x3网格,而将4个图添加在一起将创建一个2x2网格。
p1+p2+p3+p4
从上述可以看出,patchwork会默认的将多张图放在一起并对齐
🌲3.3.1 调整布局
有时候默认的设置不是我们想要表示的,我们可以通过plot_layout()控制多张图具体的分布。和facet_wrap()一样,我们需要指定nrow或者ncol的其中一个参数
p1 + p2 + p3 + plot_layout(ncol = 2)
有时候我们想要强制的将其分为一行或者一列,parchwork
中提供了两个操作符|
,/
其中/表示将两张图分成两行,|表示将两张图分为两列,并且可以嵌套使用,这在某些情况下是非常好用的
p1 / p2
p3 | p4
上述是单独使用|和/,我们下面看看如何通过这两个简单的运算符通过嵌套生成复杂的图形
p1|(p2/(p3|p4))
或者,对于非常复杂的布局,可以在plot_layout()的设计参数中指定带有文本表示的非表格布局,如下所示
layout <- "
112
3#2
344
"
p1 + p2 + p3 + p4 + plot_layout(design = layout)
这里其实就是将整个画布分为九个部分,相当于一个九宫格,其中第一幅图占第一行的前两列,第二幅图占第三列的前两行,以此类推
注意上述几个图的图例都是一样的,因此我们可以只保留其中的一个图例即可,patchwork中提供了一种简单的方法guides
参数
p1 + p2 + p3 + plot_layout(ncol = 2, guides = "collect")
上述由于我们只有三个图,其中还有一部分空余的地方,我们可以将图例放在该位置,通过guide_area()函数
p1 + p2 + p3 + guide_area() + plot_layout(ncol = 2, guides = "collect")
🌳3.1.2 修改子图
patchwork的一个特点是,在绘制之前,绘图仍然是标准的ggplot对象。这意味着它们在组装后可以进行修改。可以通过[[]]索引检索和设置特定的子图。
例如我们先将p1和p2合并
p12 <- p1 + p2
p12
下面我们想要对第二章图的主题换为light,则可以通过对p12进行索引更改
p12[[2]] <- p12[[2]] + theme_light()
p12
有时候我们还希望对所有的子图进行更改,则可以使用&
操作符
p1 + p4 & theme_light()
如果在同一轴线上具有相同的美学效果,这也可用于为绘图提供一个共同的轴线:
p1 + p4 & scale_y_continuous(limits = c(0, 45))
🌴3.1.3 增加注释
一旦绘图完成,它们就开始形成一个单一的单元。
这也意味着标题、副标题、注释和整个画布有关,而不是单独的。可以使用plot_annotation()函数将标题等添加到拼图中。
p34 <- p3 + p4 + plot_annotation(
title = "A closer look at the effect of drive train in cars",#增加标题
caption = "Source: mpg dataset in ggplot2"#增加图片说明
)
p34
可以通过theme参数更改注释的主题
p34 + plot_annotation(theme = theme_gray(base_family = "mono"))
此外,在一些文献中,我们还需要对每个子图添加标签,以便于在正文中说明,我们可以使用tag_levels参数
p123 <- p1 | (p2 / p3)
p123 + plot_annotation(tag_levels = "I") # 使用大写罗马表示
还可以通过"new"来嵌套多个标签,例如上图中,左边当做I图,右边两张图都保存在p123[2]中,可以引入一个字母对其进行进一步表示例如IIa,IIb
p123[[2]] <- p123[[2]] + plot_layout(tag_level = 'new')# 注意p123[2]包括两张图,通过tag_lever='new'来实现嵌套标签
p123 + plot_annotation(tag_levels = c("I", "a"))
上面就是patchwork将多个图组合在一起的方法,可以看出patchwork很有效,能够帮助我们绘制出许多复杂的图
🌎3.2 将多个图互相叠加在一个图中
上述我们介绍了patchwork在将多个图并排在一起的方法,同时我们也可以将其中的一些图缩小插在另一张图上
使用inset_element()函数,其中包含了一些位置参数,下面看一个最基础的示例
p1 + inset_element(p2, left = 0.5, bottom = 0.6, right = 0.9, top = 0.95)
其中left,right,top和bottom参数来定义插图的位置。默认是将整个图放缩成1×1的比例,例如left=0.4的意思就是从0.4的位置开始绘制子图的左边
不仅仅是ggplot对象都支持inset_element(),包括parchworks对象,例如先将两张图并排放在一起,再插入到某张图中
p24 <- p2 / p4 + plot_layout(guides = "collect")
p1 + inset_element(p24, left = 0.5, bottom = 0.05, right = 0.95, top = 0.9)
使用插图的一个好处也是在绘图之前,他们都是一个标准的patchwork子图对象。意味着我们可以修改这些图的美学特征
# 更改主题
p12 <- p1 + inset_element(p2, left = 0.5, bottom = 0.5, right = 0.9, top = 0.95)
p12 & theme_bw()
# 添加标签
p12 + plot_annotation(tag_levels = 'A')
💟文章推荐
如果想了解更多ggplot2数据可视化技巧,欢迎访问下列文章
☀️玩转数据可视化之R语言ggplot2:(一)ggplot2实现箱线图、小提琴图、直方图等图形(快速入门)
🌟玩转数据可视化之R语言ggplot2:(二)ggplot2实现分面绘图(Faceting),包括连续变量的转换(快速入门)
🌞玩转数据可视化之R语言ggplot2:(四)单一基础几何图形绘制