寒假在跟着python单细胞课程在学习——趁寒假学会Python,解锁单细胞数据的无限可能
目前的进展是跟完了python基础部分,具体的单细胞分析内容也就差三节课啦!

在学习python基础的时候,学习到了很多有意思的和R语言不同的知识,比如说画图之后拼图调用的包就很类似,但使用方法却又不一样。
所以这期准备对比一下R语言里面的拼图包—— thomasp85/patchwork和python里面的拼图包——ponnhide/patchworklib的异同。
thomasp85/patchwork这个包大家应该非常熟悉,是Thomas Lin Pedersen大神开发的!

patchwork是 R 语言中专门为ggplot2设计的一个极其强大且直观的拼图包。它的核心理念是“像算术运算一样组合图形”,让复杂的排版变得非常简单。

+、/、| 等数学运算符。安装可以通过 CRAN 直接安装稳定版:
install.packages("patchwork")
Github使用教程:
在使用之前,先加载包并创建几个基础图表(以 mtcars 数据集为例):
library(ggplot2)
library(patchwork)
p1 <- ggplot(mtcars) + geom_point(aes(mpg, disp))
p2 <- ggplot(mtcars) + geom_boxplot(aes(gear, disp, group = gear))
p3 <- ggplot(mtcars) + geom_smooth(aes(disp, qsec))
p4 <- ggplot(mtcars) + geom_bar(aes(carb))
(1) 横向排列:使用 + 或 |
p1 + p2
# 或者使用 | 表示并列
p1 | p2

(2) 纵向排列:使用 /
p1 / p2

(3) 组合排版(嵌套)
可以使用括号来控制布局的优先级:
(p1 | p2 | p3) / p4
# 这表示前三张图在第一行并排,第四张图占据整个第二行

调整布局细节:plot_layout()
通过这个函数可以控制列数、行数以及各图的宽度/高度比例。
p1 + p2 + p3 + plot_layout(ncol = 2, widths = c(2, 1))
# 设置为2列,且第一列宽度是第二列的2倍

统一标题与标签:plot_annotation()
可以一键为整张拼图添加总标题,并自动为子图编号(如 A, B, C)。
(p1 | p2) / p3 +
plot_annotation(
title = "我的科研结果总图",
subtitle = "利用patchwork轻松完成",
tag_levels = 'A'# 自动生成子图标签 A, B, C
)

1. 通过 plot_annotation() 函数,可以一键为整个排版好的图形添加描述性文本:
title(总标题)、subtitle(副标题)以及 caption(图注/说明)。2. 自动图形标记 (Tagging)
在科研论文中,通常需要用 A, B, C 等标签为子图编号。patchwork 提供了极其简便的自动编号功能:
启用方式:在 plot_annotation() 中设置 tag_levels 参数。
编号风格:
'1': 阿拉伯数字
'A': 大写拉丁字母
'a': 小写拉丁字母
'I': 大写罗马数字
'i': 小写罗马数字
自定义格式:可以通过 tag_prefix(前缀)、tag_suffix(后缀)和 tag_sep(分隔符)来自定义标签样式,例如生成 "Fig. A.1:" 这种复杂的格式。
嵌套编号:当存在嵌套布局时,可以为不同层级指定不同的编号规则。例如 tag_levels = c('A', '1') 会生成类似 A1, A2, B... 的层级编号。
修改图形样式 (& 运算符)
& 运算符:不同于 ggplot2 传统的 +(只作用于单个图),使用 & theme(...) 可以将样式同时应用到拼图中的所有子图上。添加空白区域
有时需要在图之间留白,可以使用 plot_spacer()。
p1 + plot_spacer() + p2

patchworklib 是一个为 Python 用户设计的图形组合库。它旨在解决 Seaborn 和 Plotnine 等库生成的图形难以像 Matplotlib 子图那样轻松排列的问题。

借鉴了 R 语言 patchwork 包的直观语法,使用类似 ax1 | ax2 的运算符进行图形拼接。
安装方法
pip install patchworklib
Brick 对象patchworklib 的核心单位是 Brick(砖块)。其基本绘图逻辑如下:
pw.Brick(figsize=(width, height)) 创建一个绘图区域。ax 参数指向创建好的 Brick 对象(例如 ax=ax1)。|)将不同的 Brick 对象组合起来。import pandas as pd
iris = pd.read_csv("iris.csv")
iris.head()
# 导入包中函数(这个包推荐,仅限这个包)
from plotnine import *
可视化及拼图
import patchworklib as pw
p1 = (ggplot(data=iris, mapping=aes(x='species', y='sepal_width', fill='species')) +
geom_boxplot(alpha = 0.5) +
geom_jitter() +
theme_bw())
p2 = (ggplot(data=iris, mapping = aes(x='sepal_length', y='petal_length')) +
geom_point() +
geom_smooth(method='lm'))
p3 = (ggplot(data=iris) +
geom_point(aes(x='sepal_length', y='petal_length'),
color='blue', # 点的颜色
fill='red', # 填充颜色
size=5, # 点的大小5mm
alpha=0.5, # 透明度 50%
shape='D')) # 点的形状
# 使用patchworklib加载plotnine图表
g1 = pw.load_ggplot(p1, figsize=(2,3))
g2 = pw.load_ggplot(p2, figsize=(2,3))
g3 = pw.load_ggplot(p3, figsize=(2,3))
g1/(g2+g3)

patchwork和patchworklib比较1. 在 R 中,图形对象是原生的 ggplot 对象;而在 Python 中,你需要手动将图形“包装”进一个特定的容器。
2. 图形绑定逻辑
+ 运算符,直接在对象层面上进行组合,不需要在绘图时指定位置。ax 参数指向对应的 Brick 对象。3. 布局控制方面
plot_layout() 可以处理非常复杂的 design 矩阵、自动收集图例 (guides = 'collect') 以及对齐坐标轴标题。ax1|ax2 的简单布局,但对于复杂的对齐和自动标记(如自动添加 A, B, C 标签)功能,目前 R 版的 patchwork 更加成熟和自动化。友情转发: