ggplot2的组图拓展包(1):patchwork(上篇)

news2024/9/20 18:40:10

专注系列化高质量的R语言教程

推文索引 | 联系小编 | 付费合集


patchwork是ggplot绘图系统的拓展包,主要功能是将多个ggplot格式的图形组合成一幅大图,即组图。

patchwork工具包十分好用,它主要利用几个类似四则运算符号的操作符进行组图,只要掌握每个操作符的功能特点及少量函数的用法,就可以很灵活地进行组图。

本篇目录如下:

  • 0 示例图形

  • 1 竖杠`|`和斜杠`/`

    • 1.1 单独运算

    • 1.2 混合运算

  • 2 加号`+`

    • 2.1 单独运算

    • 2.2 plot_layout函数(上)

    • 3.3 混合运算

  • 3 减号`-`

    • 3.1 单独运算

    • 3.2 混合运算

0 示例图形

首先,参考官方文档[1],生成如下4个ggplot对象:

library(ggplot2)
p1 <- ggplot(mtcars) + 
  geom_point(aes(mpg, disp*100)) + 
  ggtitle('Plot 1')

p2 <- ggplot(mtcars) + 
  geom_point(aes(mpg, wt)) + 
  ggtitle('Plot 2')

p3 <- ggplot(mtcars) + 
  geom_point(aes(hp, wt, colour = mpg)) + 
  ggtitle('Plot 3')

p4 <- ggplot(mtcars) + 
  geom_bar(aes(gear)) + 
  facet_wrap(~cyl) + 
  ggtitle('Plot 4')

1 竖杠|和斜杠/

patchwork工具包最基础的操作符应当是加号+,这也是继承ggplot2工具包的符号,不过竖杠|和斜杠/的功能相对单纯,因此首先加以介绍。

在R语言的基础语法中,竖杠|表示逻辑“或”,斜杠/ 表示“除法”,但在这里它们被赋予了另外的功能:竖杠|表示横向组图,斜杠/表示纵向组图。

1.1 单独运算

分别使用|/进行组图:

library(patchwork)
p1 | p2 | p3
1c04975ff2d816240a3ffa5102afe7a6.png
p1 / p2 / p3
8ab2feecde888c70387b11913ab608f2.png

通过观察组图结果,可以发现一个特点:这两个操作符会为每个图形的plot region平均分配空间。

在推文graphics | 基础绘图系统(二)—— 绘图参数及par函数中,学堂君介绍了基础绘图系统的图形共存在4个区域,这里再展示一下:

961124d2adae84ed5329050b289e05f7.png

但在默认情况下,device region、display region的边界会与figure region重叠,也就是外侧三个区域实际上是重合的,因此图形区域主要存在plot region和figure region的区别。

明白几个区域的概念,现在再来分析组图结果:

  • p1的纵坐标刻度标签较其他图更长,但它的plot region仍和其他两幅图仍然一致;因为纵坐标刻度标签位于figure region内而不位于plot region,因此它的figure region较p2更宽;

  • 同样,p3在figure region中包含一个图例,这也使得它的figure region较p2更宽。

综上,可以得出结论:|/操作符会平均分配各子图的plot region,而figure region内的要素则会额外分配空间。

此外,这两个操作符在组图时还严格贯彻“对齐”的审美观,尤以/更加明显,可以看到:

  • 在横向组图中,子图的plot region上、下边框是对齐的;在纵向组图中,尽管纵坐标刻度标签不一致以及部分子图存在图例,子图的plot region左、右边框也是对齐的;

  • 在纵向组图中,尽管纵坐标刻度标签的宽度不一致,但纵坐标变量名标签也严格对齐,刻度标签较窄的子图在与变量名标签之间还留出一部分空间。

那么如果参与组图的子图本身就包含子图,它们会如何分配空间呢?看如下例子:

p1 | p2 | p4
8d03078bac4b6c4029888a14158e1421.png
p1 / p2 / p4
18b13b34c2f993501adb4f88eb3d768d.png

从组图结果可以看出,子图的子图是作为一个整体来参与平均分配plot region的。这就涉及到嵌套水平(nesting level)的概念了。以上例来说,p1p2是与p4处于同一嵌套水平,而不是与它的子图处于同一嵌套水平。

1.2 混合运算

|/可以混合使用以实现更复杂的组图,那么它们运算的优先级是怎样的呢?

先看如下三个例子:

p1 | p2 / p3
ae15ef554844978af20454e3676620ad.png
p1 / p2 | p3
3c3d0ec8aaa0f413176786409731ced1.png
p1 / p2 | p3 / p4
b5f2bde3aae8bb3d535bb8995a097e0b.png

从组图结果可以明显看出,/的优先级高于|

此外,从嵌套水平的角度看,当只使用上述操作符的其中一个时,所有参与组图的子图都位于同一个嵌套水平;而当混合使用这两个操作符时,优先级高的操作符会先产生一个嵌套水平,其结果整体再与其他操作符产生一个更高的嵌套水平。

2 加号+

2.1 单独运算

从排列方向上看,加号+的功能不是那么纯粹。在默认情况下,它会根据参与组图的图形数量决定布局:

p1 + p2
d71dae4858192f8e0abf9608b47a76cd.png
p1 + p2 + p3
7dd15311f92eac884f4b8300cabfe5de.png
p1 + p2 + p3 + p4
4cc308c8288b889fa1e47025204691e0.png

2.2 plot_layout函数(上)

plot_layout()函数可以对组图的布局做进一步的调整。

调整行、列数:

p1 + p2 + p3 +
  plot_layout(ncol = 2) 

p1 + p2 + p3 +
  plot_layout(nrow = 2)
230bc13d2e66160efb2990ad194c3e4b.png

调整排列方向的优先顺序:

p1 + p2 + p3 +
  plot_layout(ncol = 2, byrow = F)
929f8c74ed1a5888f717bcb2dc9d1c03.png

调整各列子图的plot region的宽度比例:

p1 + p2 + p3 +
  plot_layout(ncol = 2, widths = c(1.5,1))
08f271aac39275d00ad48aa65cecd4a4.png

调整各行子图的plot region的高度比例:

p1 + p2 + p3 +
  plot_layout(ncol = 2, heights = c(1, 1.5))
351d0175917e1d89b28a69489f3351d9.png

plot_layout()函数的其他功能会在后文进一步介绍。

3.3 混合运算

加号+与竖杠|和斜杠/混合运算时,优先级是怎样的呢?

先看+|的优先级比较:

p1 + p2 | p3
531b69a67de44be5e7fd150067d2e8d5.png
p1 | p2 + p3
5829c5d672bfe843f1e793b121d68533.png

显然,+的优先级高于|

再看+/的优先级比较:

p1 + p2 / p3
d076d0466a21a49a26e60a83a46fd65b.png

显然,+的优先级低于/

综上,三个操作符的优先级顺序为/ > + > |

3 减号-

3.1 单独运算

按照工具包作者的说法,与其将-看作是减号,还不如看作是连字符。从排列方向上看,它也是横向进行组图的,但与|+存在区别。

区别主要体现在嵌套水平的产生上。其实不管是|/,还是+,单独使用它们中的一个,都会将所有子图置于同一嵌套水平,而-每使用一次都会产生一个嵌套水平。

看如下两个例子:

p1 - p2
3c2f533d1ee13bc581dbc65e9105e90a.png
p1 - p2 - p3
87d4666b66d153a70ba28f9536161a3e.png

可以看出,在连续使用两次-时,首先会将p1p2在同一嵌套水平上横向组图,然后再将组图结果作为整体与p3在同一嵌套水平上进行横向组图。当连续使用-时,从左往右各子图的宽度比就会是:

3.2 混合运算

在混合运算时,-的优先级和+是一致的。从左往右,谁先出现就先使用谁。

p1 + p2 - p3
fdb41ca4820fc437f67e62e9d833b55f.png
  • 先计算p1 + p2,再作为整体与p3横向组合。

p1 - p2 + p3
65cd5a4f9c0e92f254bf75293f1d0a9a.png
  • 这里显示+的功能很特殊。尽管先计算了p1 - p2,但p3仍然与它们处于同一嵌套水平。

-的优先级低于/

p1 - p2 / p3
a2c02e8131539ddb6b7ae7b82b4c2b5f.png

-的优先级高于|

p1 | p2 - p3
facc1b6ffa4e0f74ab83bd502eed3902.png
p1 - p2 | p3
40fd6787c3da856581e1f7921d1f31c7.png
  • 注意与p1 - p2 + p3的结果作比较。

综上,三个操作符的优先级顺序为/ > + = - > |

未完待续。

参考资料

[1]

patchwork: Getting Started: https://mirrors.tuna.tsinghua.edu.cn/CRAN/web/packages/patchwork/vignettes/patchwork.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/391761.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python——函数(重点内容)

函数 函数是组织好的&#xff0c;可重复使用的&#xff0c;用来实现单一&#xff0c;或相关联功能的代码段。 函数能提高应用的模块性&#xff0c;和代码的重复利用率。你已经知道Python提供了许多内建函数&#xff0c;比如print()。但你也可以自己创建函数&#xff0c;这被叫…

Linux 常用软件安装(jdk,redis,mysql,minio,kkFileView)

1.jdk安装 查询所有跟Java相关的安装的rpm包 rpm -qa | grep java卸载所有跟openjdk相关的包&#xff1a; 执行命令。删除以上除了noarch 结尾的所有文件 rpm -e --nodeps java-1.8.0-openjdk-1.8.0.252.b09-2.el8_1.x86_64 rpm -e --nodeps java-1.8.0-openjdk-headless-1.8.0…

钉钉端H5开发调试怎么搞

H5开发本地调试教程 作为一名前端开发,大家平时工作中或多或少都有接触或需要开发H5页面的场景,在开发过程中,如何像PC端页面一样有有丝滑的体验呢? 不同的情况需要在不同的端调试更方便有效: 1. 在画UI的时候,更适合在PC端调试,更改代码或者直接在浏览器调试,都是实…

LeetCode链表(单链表,双链表,反转链表)

文章目录前言1.链表定义2.链表操作3.技巧链表常见操作1.lc203 移除链表元素2.lc2 两数相加3.lc328 奇偶链表反转链表1.lc206 反转链表2.lc92 反转链表II链表双指针1.lc19 删除链表的倒数第 N 个结点2.lc21 合并两个有序链表3.lc24 两两交换链表中的节点4.lc234 回文链表前言 本…

Vue3倒计时组件(Countdown)

可自定义设置以下属性&#xff1a; 倒计时数值&#xff08;countdown&#xff09;&#xff0c;单位s&#xff0c;必传倒计时标题&#xff08;title&#xff09;&#xff0c;默认Countdown&#xff0c;string | v-slot格式化倒计时展示&#xff08;format&#xff09;&#xff…

“操作无法完成,因为其中的文件或文件夹一再另一程序打开”解决方法

windows系统中&#xff0c;有时时候我们想要修改某个文件&#xff0c;就出现出现如下提示&#xff1a;操作无法完成&#xff0c;因为其中的文件或文件夹已在另一程序打开请关闭该文件或文件夹&#xff0c;然后重试出现这个上面提示的原因是&#xff0c;我们要修改的文件或文件夹…

网络基础(1)

目录1. 网络1.1 网络是什么1.2 网络在哪里2. 协议3. TCP/IP五层(或四层)模型3.1 分层细节3.2 报头3.2.1 封装与解包4. 数据传输4.1 局域网4.2 IP地址与Mac地址1. 网络 1.1 网络是什么 网络本质是一个软件&#xff0c;软件是可以进行分层的。例如STL库&#xff0c;实际上分为了…

文件包含漏洞1 | iwebsec

文章目录00-文件包含漏洞原理环境01-本地文件包含读取敏感文件信息配合文件上传getshell配合日志文件getshell配合SSH日志配合运行环境00-文件包含漏洞原理 为什么要文件包含&#xff1f; 为什么会有文件包含漏洞? 因为将被包含的文件设置为变量&#xff0c;用来进行动态调用…

169_技巧_Power BI 依据促销日历计算销售金额

169_技巧_Power BI 依据促销日历计算销售金额 一、背景 在各位表格表姐们计算销售金额的时候&#xff0c;有一个绕不开的问题&#xff1a;商品有促销的问题&#xff0c;需要使用对应的促销价来计算销售额。 按照惯例还是先来看看结果 Power BI 公共 web 效果&#xff1a;htt…

使用docker进行Mongoyapi安装,Mongo重启yapi重启

在这里我使用Linux虚拟机作为docker服务器&#xff0c;本机通过xshell进行远程操作。 Mongo安装&#xff1a;docker run -d --name mongo-yapi mongo; yapi安装&#xff1a;1&#xff09;拉取yapi docker pull registry.cn-hangzhou.aliyuncs.com/anoy/yapi 2&#xff09;初…

2023款欧拉好猫上市,12.98万起

上周&#xff0c;2023款欧拉好猫焕新上市。2023款好猫共推出5个车型&#xff1a; •401km标续航&#xff0c;舒享型/豪华型/尊贵型&#xff0c;分别是12.98/13.98/14.98万元&#xff1b; •501km长续航&#xff0c;豪华型/尊贵型&#xff0c;分别是15.58/16.58万元&#xff1b;…

00后整顿职场,当摸鱼测试员遇上了内卷00后。

在程序员职场上&#xff0c;什么样的人最让人反感呢? 是技术不好的人吗?并不是。技术不好的同事&#xff0c;我们可以帮他。 是技术太强的人吗?也不是。技术很强的同事&#xff0c;可遇不可求&#xff0c;向他学习还来不及呢。 真正让人反感的&#xff0c;是技术平平&…

【PaddleOCR-kie】一、关键信息抽取:使用VI-LayoutXLM模型推理预测(SER+RE)

背景&#xff1a;在训练自己数据集进行kie之前&#xff0c;想跑一下md里面的例程&#xff0c;但md教程内容混乱&#xff0c;而且同一个内容有多个手册&#xff0c;毕竟是多人合作的项目&#xff0c;可能是为了工程解耦&#xff0c;方便更新考虑……需要运行的模型和运行步骤散落…

没有钱怎么创业?一分钱没有如何能创业成功?

限制人创业成功的从来都不是资金&#xff0c;而是能力&#xff0c;这个道理很多人都可能不懂&#xff0c;多数人习惯了庸庸碌碌、日复一日地打工行为&#xff0c;却不知如何创业&#xff0c;那么&#xff0c;没有钱怎么创业&#xff1f;一分钱没有如何能创业成功呢&#xff1f;…

【深度学习】预训练语言模型-BERT

1.BERT简介 BERT是一种预训练语言模型&#xff08;pre-trained language model, PLM&#xff09;&#xff0c;其全称是Bidirectional Encoder Representations from Transformers。下面从语言模型和预训练开始展开对预训练语言模型BERT的介绍。 1-1 语言模型 语言模型 &#xf…

iOS(一):Swift纯代码模式iOS开发入门教程

Swift纯代码模式iOS开发入门教程项目初始化&#xff08;修改为纯代码项目&#xff09;安装第三方库&#xff08;以SnapKit库为例&#xff09;桥接OC库&#xff08;QMUIKit&#xff09;封装视图并进行导航跳转示例&#xff1a;使用 TangramKit 第三方UI布局库应用国际化添加 R.s…

NICEGUI---ROS开发之中常用的GUI工具

0. 简介 对于ROS来说&#xff0c;如果不具备一定知识的人员来使用这些我们写的算法&#xff0c;如果说没有交互&#xff0c;这会让用户使用困难&#xff0c;所以我们需要使用GUI来完成友善的数据交互&#xff0c;传统的GUI方法一般有PYQT这类GUI方法&#xff0c;但是这类GUI工…

激光炸弹(前缀和)

地图上有 N 个目标&#xff0c;用整数 Xi,Yi 表示目标在地图上的位置&#xff0c;每个目标都有一个价值 Wi。注意&#xff1a;不同目标可能在同一位置。现在有一种新型的激光炸弹&#xff0c;可以摧毁一个包含 RR 个位置的正方形内的所有目标。激光炸弹的投放是通过卫星定位的&…

顺序表以及链表的应用及区别(包含OJ讲解)

前面我已经发过怎么实现链表以及顺序表&#xff0c;今天大概的总结一下。 顺序表&#xff1a; 1.能够随时的存取&#xff0c;比较方便。 2.插入删除时&#xff0c;需要挪动数据&#xff0c;比较麻烦&#xff0c;因为是连续存储。 3.存储密度相对于链表来说是比较高的&#…

C++类的组合

C类的组合什么是类的组合初始化参数列表使用类的组合案例分析组合构造和析构顺序问题this指针基本用法和作用什么是类的组合 类的组合就是以另一个对象为数据成员&#xff0c;这种情况称为类的组合 1.优先使用类的组合&#xff0c;而不是继承 2.组合表达式的含义 一部分关系 初…