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


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

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


本篇接上篇patchwork(上篇),目录如下:

  • 0 示例图形

  • 4 星号`*`

    • 4.1 基本功能

    • 4.2 优先级

    • 4.3 识别嵌套水平

  • 5 `&`操作符

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')

4 星号*

4.1 基本功能

*可以统一向当前嵌套水平的所有子图添加代码。

先使用+进行组图:

library(patchwork)
p1 + p2
15e0cdb1be9a3a9779b64ac878c2a285.png

使用*统一设置子图的主题风格:

(p1 + p2) * theme_bw(base_family = "mono")
c58ec8e315b5d27eac467503494bd82f.png

对比使用+的效果,它只会设置最后一个子图的主题:

(p1 + p2) + theme_bw(base_family = "mono")
eee295c5c1b0b2344134de7bcae466a2.png

除了主题函数,*后面也可以跟其他类型的函数,如几何图形函数:

(p1 + p2) * 
  geom_histogram(aes(mpg), bins = 15,
                 col = "black", alpha = 0.2) *
  theme_bw(base_family = "mono")
1e06c022e44ec68aefd324e21c87f869.png

4.2 优先级

再来看以下例子:

p1 / p2 * theme_bw(base_family = "mono")
159d9c6320fdd283e63bbc65d2d029e6.png

读者可能会疑惑:为何前面的例子(p1 + p2) * theme_bw(base_family = "mono")+部分需要加括号,而这里/部分则不需要加括号?

这是因为*的优先级与/一样,并高于+-,因此如果/在前就会先运算/,不需要额外加括号,即p1 / p2 * g = (p1 / p2) * g

  • 这里p1p2表示子图,g表示某段代码,如主题函数、几何图形函数等。

反之,如果*在前就会先运算*,即p1 * g / p2 = (p1 * g) / p2

p1 * theme_bw(base_family = "mono") / p2
db1cc231a039ef60d67a1187867b871c.png

*的优先级高于+,无论二者谁在前,都会先运算*部分:

p1 * theme_bw(base_family = "mono") + p2
6e530709357472d78747621887a75294.png
p1 + p2 * theme_bw(base_family = "mono")
5429aa465a3899ea9707cb5d70a0455e.png

在编程语言中,星号*常用来指代乘号,因此这个优先级顺序实际上和四则运算是一致的。

在前面的例子中,为了降低*的优先级而使用括号,原理如下:

4.3 识别嵌套水平

*只会作用于当前嵌套水平的子图,因此可以利用它来识别组图的嵌套水平。

(p1 + (p2 | p3) + p4) * 
  theme_bw(base_family = "mono")
112ee48c39c86ba403fa3312ba1daa60.png
  • p2p3处于同一嵌套水平,然后作为整体与p1p4处于更高嵌套水平,因此*后的代码只作用于p1p4

读者可使用此方法识别和验证推文patchwork(上篇)中相关例子的嵌套水平。

5 &操作符

&操作符会将代码应用于所有嵌套水平的子图。

(p1 + (p2 | p3) + p4) & 
  theme_bw(base_family = "mono")
dc2fb255b1834b88095e9e25d87bb710.png

&的优先级低于+-/,并且不能位于它们之前

不加括号也可以实现上例的效果:

p1 + (p2 | p3) + p4 & theme_bw(base_family = "mono")
df2e750be6dc20c83e84d20379ab44e4.png

&位于+-/之前程序会报错:

## 以下代码均会报错

p1 & theme_bw(base_family = "mono") + p2

p1 & theme_bw(base_family = "mono") - p2

p1 & theme_bw(base_family = "mono") / p2

&的优先级低于*,但可以位于它之前

p1 + p2 & g1 * g2 = p1 + p2 & (g1 * g2)

p1 + p2 & theme_bw() * theme(text = element_text(family = "mono"))
d4ce34a819a4b9ede4c87fe5bf02b5d5.png

p1 + p2 * g1 & g2 = p1 + (p2 * g1) & g2

p1 + p2 * theme_bw() & theme(text = element_text(family = "mono"))
5bea61679048bc3b32e9a7e2e33369e1.png

&的优先级高于|

p1 & g | p2 = (p1 & g) | p2

p1 & theme_bw(base_family = "mono") | p2
81041190fb2c7b93dc5a0805db7daac3.png

p1 | p2 & g = p1 | (p2 & g)

p1 | p2 & theme_bw(base_family = "mono")
85fa185987adb576ad435e95330f9159.png

至此,上篇结束,主要介绍的内容如下:

  • 各种操作符的功能,它们的优先级顺序为:() > * = / > + = - > & > |

  • +-/|单独连续使用只产生一个嵌套水平,-每使用一次都会产生一个嵌套水平;操作符混合使用会增加嵌套水平;

  • *右侧的代码只应用于当前嵌套水平下的子图;&右侧的代码应用于所有嵌套水平的子图。

敬请期待中篇。

参考资料

[1]

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

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
很抱歉,我无法提供Patchwork++算法的具体代码。Patchwork++是一种用于图像水印嵌入的算法,它利用自适应地面似然估计(A-GLE)和时间地面恢复(TGR)来解决地面分割和部分欠分割问题。该算法通过对载体图像进行DCT变换并提取直流分量,然后在直流分量矩阵中嵌入水印。嵌入方法是增加/减去置乱的水印图像分量k倍的亮度。最后,将嵌入水印后的直流分量矩阵进行反DCT变换,完成水印嵌入。该算法还利用人类视觉系统对不同颜色的敏感程度不同的特性,将红色和蓝色光部分作为A集合,绿色光作为B集合,在嵌入信息时使用相逆的操作,以提高水印透明性。具体的Patchwork++算法代码可能需要参考相关的研究论文或专业文献。 #### 引用[.reference_title] - *1* [Patchwork&Patchwork++ 激光雷达点云地面分割(附代码)](https://blog.csdn.net/a394467238/article/details/129303235)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [数字水印 改进的patchwork算法 实现](https://blog.csdn.net/qq_44465615/article/details/116420445)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值