当前位置:首页>python>科研绘图之R & Python拼图包简介

科研绘图之R & Python拼图包简介

  • 2026-09-16 13:37:42
科研绘图之R & Python拼图包简介

写在开头

寒假在跟着python单细胞课程在学习——趁寒假学会Python,解锁单细胞数据的无限可能

目前的进展是跟完了python基础部分,具体的单细胞分析内容也就差三节课啦!

在学习python基础的时候,学习到了很多有意思的和R语言不同的知识,比如说画图之后拼图调用的包就很类似,但使用方法却又不一样。

所以这期准备对比一下R语言里面的拼图包—— thomasp85/patchwork和python里面的拼图包——ponnhide/patchworklib的异同。

拼图R包patchwork

thomasp85/patchwork这个包大家应该非常熟悉,是Thomas Lin Pedersen大神开发的!

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

  • 语法简单:直接使用 +、/、| 等数学运算符。
  • 自动对齐:它会自动处理坐标轴、图例和绘图区域的对齐,确保不同图表看起来整齐划一。
  • 高度灵活:支持复杂的嵌套布局。

安装可以通过 CRAN 直接安装稳定版:

install.packages("patchwork")

Github使用教程:

  • Getting Started
  • Assembling Plots
  • Defining Layouts
  • Adding Annotation
  • Aligning across pages

基本使用方法

在使用之前,先加载包并创建几个基础图表(以 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

Python中拼图包patchworklib

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

借鉴了 R 语言 patchwork 包的直观语法,使用类似 ax1 | ax2 的运算符进行图形拼接。

安装方法

pip install patchworklib

使用流程:Brick 对象

patchworklib 的核心单位是 Brick(砖块)。其基本绘图逻辑如下:

  • 创建 Brick:通过 pw.Brick(figsize=(width, height)) 创建一个绘图区域。
  • 绑定图形:在调用 Seaborn 或 Plotnine 的绘图函数时,将 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. 图形绑定逻辑

  • R: 拼图包通过重载 + 运算符,直接在对象层面上进行组合,不需要在绘图时指定位置。
  • Python: 采用“依赖注入”模式。在调用 Seaborn 或 Matplotlib 的绘图函数时,必须将 ax 参数指向对应的 Brick 对象。

3. 布局控制方面

  • R 版:功能更为强大且集成化。通过 plot_layout() 可以处理非常复杂的 design 矩阵、自动收集图例 (guides = 'collect') 以及对齐坐标轴标题。
  • Python 版:虽然也支持类似 ax1|ax2 的简单布局,但对于复杂的对齐和自动标记(如自动添加 A, B, C 标签)功能,目前 R 版的 patchwork 更加成熟和自动化。

友情转发:

最新文章

随机文章