不用PS!patchwork快速解决多子图组合问题~~

news2024/11/22 16:52:22

如果现在你还是将自己制作的图表放在PS或者PPT中进行随意组合的化,那么这篇文章你就得好好看看了,今天小编就给大家安利一个超强的突变自由组合包-patchwork,让你轻松实现多图的自由组合。

更多详细的数据可视化教程,可订阅我们的店铺课程:

下面小编结合实例介绍一下该包的主要用法:

patchwork 基本功能介绍

  1. 使用自带的数据进行单个图表的绘制:

library(tidyverse)
library(ggtext)
library(hrbrthemes)
library(patchwork)

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

p2 <- ggplot(mtcars) + 
  geom_boxplot(aes(gear, disp, group = gear)) + 
  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的基础用法

patchwork合并不同图表的基本操作十分简单,使用 + 号进行不同图表之间的组合,如下:

p1 + p2

p1 + p2

p1 + p2

当突变进行合并之后,我们可对最后一个(p2)进行其他ggplot2图层元素的添加,如添加标题(title):

p1 + p2 + labs(subtitle = 'This will appear in the last plot',caption = "Visualization by DataCharm")

p1 + p2_with_title_caption

p1 + p2_with_title_caption

  1. 控制布局(Controlling layout)

默认情况下,patchwork将按行顺序排列图表,并使网格保持正方形。如下:

p1 + p2 + p3 + p4

by row

by row

如果不想按照默认的行排列的化,你可以通过使用plot_layout() 函数进行组合布局的调整。如下:

p1 + p2 + p3 + p4 + plot_layout(nrow = 3, byrow = FALSE)

nrow_byrow_set

nrow_byrow_set

注意这次结果和上一个结果的不同(图中红圈标出),plot_layout()函数还有很多其他功能,小伙伴们可自行探索哈~~

  1. 堆叠和包装不同图表(Stacking and packing plots)

这个功能也是小编最喜欢的功能之一了,而patchwork包提供了 |- 并排图表,和 / -堆叠图表 操作,来灵活的对不同图表进行排列组合。下面通过实例进行说明:

p1 / p2

p1 / p2

p1 / p2

p1 | (p2 / p3)

p1 | (p2 / p3)

p1 | (p2 / p3)

  1. 添加注释文本信息(Annotating the composition)

在对图表进行合并后,我们通常需要添加一些注释文本(标题、序号等),这时,可通过 plot_annotation()进行快速添加:

(p1 | (p2 / p3)) + 
  plot_annotation(title = 'The surprising story about mtcars', caption = "Visualization by DataCharm")

exam of plot_annotation

exam of plot_annotation

此外,plot_annotation()还可以自动添加标签功能,这个在绘制多幅图表时可是经常用的方法哦~

p1 + p2 + p3 + 
  plot_annotation(tag_levels = 'a')

tag_levels

tag_levels

标签功能这里只介绍基本的,还有跟多用法,小伙伴们可去官网进行了解。

以上就完成了对patchwork包基本功能的介绍,当然,这些都是基础,想要探索更多功能,小伙伴们可去官网查看:https://patchwork.data-imaginist.com/articles/patchwork.html,接下来,还是老样子,小编再进行一幅定制化图表的操作(会用上以上全部方法)

patchwork 定制化出图

单独绘制每个可视化图表:

library(ggpol)
library(ggpubr)

ToothGrowth$dose <- as.factor(ToothGrowth$dose)
# Comparisons against reference
stat.test <- compare_means(
  len ~ dose, data = ToothGrowth, group.by = "supp",
  method = "t.test", ref.group = "0.5"
)
# plot01
bp <- ggbarplot(ToothGrowth, x = "supp", y = "len",
                fill = "dose", palette = "jco",
                add = "mean_sd", add.params = list(group = "dose"),
                position = position_dodge(0.8))
plot_01 <- bp + stat_pvalue_manual(
  stat.test, x = "supp", y.position = 33,
  label = "p.signif",
  position = position_dodge(0.8)
)

#plot02
library(ggsci)
df <- data.frame(score = rgamma(150, 4, 1), 
                 gender = sample(c("M", "F"), 150, replace = TRUE), 
                 genotype = factor(sample(1:3, 150, replace = TRUE)))

plot_02 <- ggplot(df) + 
  geom_boxjitter(aes(x = genotype, y = score, fill = gender),
                 jitter.shape = 21, jitter.color = NA, 
                 jitter.height = 0, jitter.width = 0.04,
                 outlier.color = NA, errorbar.draw = TRUE) +
  ggsci::scale_fill_jco() 
  
#plot03
set.seed(1234)
wdata = data.frame(
   sex = factor(rep(c("F", "M"), each=200)),
   weight = c(rnorm(200, 55), rnorm(200, 58)))
plot_03 <- ggdensity(wdata, x = "weight", fill = "lightgray",
                       add = "mean", rug = TRUE) 
# plot04
set.seed(1234)
wdata = data.frame(
   sex = factor(rep(c("F", "M"), each=200)),
   weight = c(rnorm(200, 55), rnorm(200, 58)))

plot_04 <- gghistogram(wdata, x = "weight", fill = "sex",
   add = "mean", palette = c("lightgray", "gray50"),add_density = TRUE,rug = TRUE)
   
# 使用patchwork进行组合并添加主题
patchwork_example <- plot_01 + plot_02 + plot_03 + plot_04 +
  plot_annotation(tag_levels = 'A',
                  title = "Example of <span style='color:#D20F26'>patchwork Process</span>",
                  subtitle = "processed charts with <span style='color:#1A73E8'>plot_annotation & theme()</span>",
                  caption = "Visualization by <span style='color:#DD6449'>DataCharm</span>") & 
  theme_minimal(base_family = "Roboto Condensed") &
  theme(
       plot.title = element_markdown(hjust = 0.5,vjust = .5,color = "black",face = 'bold',
                                     size = 20, margin = margin(t = 1, b = 12)),
       plot.subtitle = element_markdown(hjust = 0,vjust = .5,size=15),
       plot.caption = element_markdown(face = 'bold',size = 12),
  )

最终的可视化结果如下:

patchwork_example

可以看出,patchwork包提供了一键设置全部图表主题风格的(& 添加图层即可),这个功能再对绘制多图时可是非常便利的。 https://patchwork.data-imaginist.com/

总结

今天小编推荐的这个绘图技巧对需绘制多图且需要合并的小伙伴来说,可谓是一大绘图利器,希望感兴趣的小伙伴可以学习下哦~~

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

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

相关文章

粗糙表面仿真和处理软件

首款基于粗糙表面的仿真和处理软件&#xff0c;该软件具有三种方法&#xff0c;主要是二维数字滤波法&#xff0c;相位频谱法和共轭梯度法。可以分别仿真具有高斯和非高斯分布的粗糙表面&#xff0c;其中非高斯表面利用Johnson转换系统进行变换给定偏度和峰度。对生成的粗糙表面…

怎么把视频转换成音频?深受大家喜欢的6个转换方法

怎么把视频转换成音频&#xff1f;在这个数字化迅速发展的时代&#xff0c;视频和音频已经成为我们生活中不可或缺的一部分。我们通过各种平台观看电影、听音乐、学习知识&#xff0c;视频内容承载着丰富的信息和情感。然而&#xff0c;有时候我们并不需要画面&#xff0c;而仅…

SpringBoot美发门店系统:智能库存管理

3系统分析 3.1可行性分析 通过对本美发门店管理系统实行的目的初步调查和分析&#xff0c;提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本美发门店管理系统采用SSM框架&#xff0c;JAVA作为开发语…

JavaScript 常量/数据类型/类型转换 简单学习

目录 1. 常量 1.1 常量概述 1.2 案例 1.3 总结 2. 数据类型 2.1 概述 2.2 分类 2.2.1 基本数据类型 2.2.1 基本数据类型——number (数值/字型) 2.2.1 数字型——算术运算符 2.2.1 基本数据类型——String (字符串类型) 2.2.1 字符串拼接 2.2.1 模板字符串 2.2.1…

数据中心运维挑战:性能监控的困境与智能化解决方案的探寻

随着数字化进程的加速&#xff0c;数据中心已成为企业信息架构的核心支撑&#xff0c;其运维管理的复杂度和重要性也随之提升。运维团队需应对设备老化、资源分配失衡、性能波动等多重难题&#xff0c;以确保数据中心持续高效运行。 其中&#xff0c;性能监控作为运维管理的关键…

如何实现异地组网?最简单的方法与实用技巧

随着远程办公、跨地域团队协作以及家庭网络需求的增加&#xff0c;异地组网已成为许多人关注的焦点。异地组网的目的是让位于不同地点的设备可以通过互联网实现安全、稳定的连接&#xff0c;从而共享数据和资源。本文将详细介绍几种常见且简便的异地组网方法&#xff0c;包括使…

智慧园区平台项目建设方案

随着信息技术的飞速发展&#xff0c;智慧园区作为智慧城市的重要组成部分&#xff0c;正逐渐成为推动城市可持续发展的关键力量。本文旨在探讨智慧园区平台项目的建设内容&#xff0c;以期为相关领域的专家学者和决策者提供参考。 1. 智慧园区的定义与重要性 智慧园区是指运用…

C++设计模式——代理模式

欢迎来到 破晓的历程的 博客 ⛺️不负时光&#xff0c;不负己✈️ 文章目录 引言代理模式的定义代理模式的具体实现 引言 我们经常听到代理服务器「代理服务器是一个中间服务器&#xff0c;能够接收客户端的请求&#xff0c;并代表客户端向服务器发起请求&#xff0c;然后将服…

计算、通信、感知与量子技术国际学术会议

第三届计算、通信、感知与量子技术国际会议&#xff08;CCPQT 2024&#xff09;将于2024年10月25日-10月27日在中国珠海召开&#xff0c;聚焦感知、绿色通信等领域&#xff0c;邀请国内外专家探讨前沿动态&#xff0c;旨在促进学术交流与产学研合作&#xff0c;推动学科融合发展…

YOLOv11改进策略【损失函数篇】| 利用MPDIoU,加强边界框回归的准确性

一、背景 目标检测和实例分割中的关键问题&#xff1a; 现有的大多数边界框回归损失函数在不同的预测结果下可能具有相同的值&#xff0c;这降低了边界框回归的收敛速度和准确性。 现有损失函数的不足&#xff1a; 现有的基于 ℓ n \ell_n ℓn​范数的损失函数简单但对各种尺度…

【LLM论文日更】| BGE经典论文-CPACK

论文&#xff1a;https://arxiv.org/pdf/2309.07597代码&#xff1a;GitHub - FlagOpen/FlagEmbedding: Retrieval and Retrieval-augmented LLMs机构&#xff1a;BAAI领域&#xff1a;embedding model发表&#xff1a;SIGIR 2024 ​ 研究背景 研究问题&#xff1a;这篇文章…

第十一章:规划过程组(11.18规划风险管理--11.24规划干系人参与)

前面几次考试几乎都考了风险管理的相关内容和试题~&#xff01;尤其是下午题所以感觉还是挺重要的&#xff01; 11.18 规划风险管理 11.18.1 风险基本概念 每个项目都在两个层面上存在风险:一是每个项目都有会影响项目达成目标的单个风险;二是由单个风险和不确定性的其他来源联…

RandLA-Net PB C++

tensorflow pb 模型 实现 c++ 部署 Code: https://github.com/QingyongHu/RandLA-Net RandLA-Net PB C++ randlanet_tf.h #ifndef RANDLANET_TF_H_

人工智能在免疫组化以及虚拟多重免疫荧光染色中的应用|文献速递·24-10-10

小罗碎碎念 这期推文准备了四篇文章&#xff0c;覆盖了AI在免疫组化、多重免疫组化以及虚拟多重免疫荧光染色中的应用。 目前来看&#xff0c;免疫组化这些技术大多用于验证&#xff0c;那么我们是否可以把从免疫组化分析得到的结论作为模型的先验知识&#xff0c;或者直接进…

vue3中 a-table设置某一个单元格的背景颜色

需求&#xff1a;根据某一个单元格中的某个条件不同&#xff0c;设置动态的颜色&#xff1b; 思路&#xff1a;通过官方文档提供的customCell进行判断设置不同的颜色背景&#xff0c;案例中进行了简单的行列判断&#xff0c;同学们可以根据自己的需求修改判断条件&#xff0c;动…

知乎信息流广告开户是啥政策?

作为国内领先的知识分享平台&#xff0c;知乎以其高质量的内容和精准的用户群体&#xff0c;成为了品牌营销的新蓝海。为了帮助更多企业抓住这一机遇&#xff0c;云衔科技正式推出知乎信息流广告开户及代运营服务&#xff0c;旨在为企业提供一站式的营销解决方案。 一、为什么…

mapbox解决wmts请求乱码问题

贴个群号 WebGIS学习交流群461555818&#xff0c;欢迎大家 事故现场 如图所示&#xff0c;wmts请求全是乱码&#xff0c;看起来像是将一个完整的请求拆成一个一个的字母了&#xff0c;而且控制台打印map.getStyle() 查看该source发现不出异常 解决办法 此类问题就是由于更…

服装生产管理的现代化:SpringBoot框架

2 关键技术简介 2.1 JAVA技术 Java是一种非常常用的编程语言&#xff0c;在全球编程语言排行版上总是前三。在方兴未艾的计算机技术发展历程中&#xff0c;Java的身影无处不在&#xff0c;并且拥有旺盛的生命力。Java的跨平台能力十分强大&#xff0c;只需一次编译&#xff0…

私域电商新纪元:消费增值模式引领百万业绩飞跃

各位朋友&#xff0c;我是吴军&#xff0c;专注于带领大家深入探索私域电商领域的非凡魅力与潜在机会。 今天&#xff0c;我想与大家分享一个鼓舞人心的真实故事。在短短的一个月内&#xff0c;我们的合作伙伴实现了业绩的飞跃&#xff0c;突破百万大关&#xff0c;并且用户活跃…

怎么给视频调色,新手一键调色的技巧

视频调色是视频创作的灵魂&#xff0c;赋予影像色彩魅力&#xff0c;化平凡为视觉盛宴。调整视频的色调&#xff0c;唤醒画面生机&#xff0c;营造独特氛围。下面就来教大家如何快速给视频调色&#xff0c;揭秘高效调色秘籍&#xff0c;享受视觉情感双重盛宴&#xff0c;新手也…