Python技术迷

patchworklib,一款强大的 Python 库!

平时做 Python 可视化的时候,你是不是经常被 Matplotlib 那些 subplot 的位置、大小、间距搞得脑仁疼?尤其是做报告的时候,一个图不够用,两个图又排得奇奇怪怪,三张图一拼直接撞到边缘……而这时候 patchworklib 真的是救命稻草。

它的定位很简单:让你像搭积木一样拼图。

下面我就按平时工作里最真实的使用方式,带你看看它到底怎么用、哪里好用、值得在什么场景替代 subplot。

patchworklib 能干嘛?

一句话:把多个 Matplotlib 图像组合到一张画布上,而且排版简单、自然、不用你绞尽脑汁调参数。

常见需求例子:

  • 两张图左右拼一下
  • 竖直排列多张图
  • 复杂排版:左边一张竖图 + 右边两张小图上下排列
  • 多图自动对齐、不跑偏、不挤压
  • 可对每个子图独立设置宽高比例

你之前可能要写:

fig, axs = plt.subplots(2, 2, gridspec_kw={'width_ratios': [2, 1]})

然后不断调 wspace、hspace、subplots_adjust。

而 patchworklib 是这样的:

from patchworklib import *

p1 = Patch(ax1)
p2 = Patch(ax2)
layout = p1 | p2   # 横向拼接
layout.savefig("result.png")

是不是舒服得离谱?

先来个最普通也最常见的使用例子

假设你想把两张折线图左右放一起。

import matplotlib.pyplot as plt
from patchworklib import Patch

# 第一个图
fig1, ax1 = plt.subplots()
ax1.plot([1, 2, 3], [2, 4, 3])

# 第二个图
fig2, ax2 = plt.subplots()
ax2.plot([1, 2, 3], [3, 1, 5])

# 用 patchwork 拼接
p1 = Patch(ax1)
p2 = Patch(ax2)

layout = p1 | p2   # 左右并排
layout.savefig("two_plots.png")

注意看: 你没有创建新的 subplot,也没有规定网格,也没有调宽高比例,patchworklib 全自动帮你排好了。

上下拼?一样简单

layout = p1 / p2   # 上下排列
layout.savefig("vertical.png")

只有 / 和 | 两种操作符就能满足大部分排版。

多图复杂布局示例

比如数据分析报告里很典型的布局:左边一张大图,右边上下各一张小图:

+-----------+-------+
|           |   A   |
|     B     +-------+
|           |   C   |
+-----------+-------+

代码只要这样写:

p_left = Patch(ax_big)
p_right_top = Patch(ax_top)
p_right_bottom = Patch(ax_bottom)

right = p_right_top / p_right_bottom
layout = p_left | right
layout.savefig("complex.png")

这就完了。 不需要 gridspec,不需要手调边距。

你完全可以在生产环境的可视化报表里用它给前端输出一张完美的图,不会乱七八糟。

自定义宽高比也很丝滑

想让左边大图占 2 份宽度、右边占 1 份,可以直接这样:

layout = p_left * 2 | p_right_top

*2 表示宽度乘 2。

不需要去算实际像素大小,也不需要手动 set_figwidth。

支持和 Matplotlib 的无缝衔接

patchworklib 不取代 Matplotlib,它只是帮你把图“摆好”。

所有绘制行为依然在 Matplotlib 的 ax 上完成,所以你任何复杂图(比如 heatmap、bar、箱线图)都能完美兼容。

更高级:给子图之间手动加间距

比如你觉得图太挤了:

layout = (p_left | p_right_top).margins(20)
layout.savefig("with_margin.png")

margins 单位是像素,非常直观。

实战示例:三张图做趋势分析

import matplotlib.pyplot as plt
from patchworklib import Patch

# 图1
fig1, ax1 = plt.subplots()
ax1.plot([1,2,3,4], [2,3,5,4])
p1 = Patch(ax1)

# 图2
fig2, ax2 = plt.subplots()
ax2.bar([1,2,3], [3,2,4])
p2 = Patch(ax2)

# 图3
fig3, ax3 = plt.subplots()
ax3.scatter([1,2,3], [4,3,5])
p3 = Patch(ax3)

layout = p1 / (p2 | p3)
layout.savefig("result.png")

左一张大图,下方右边两个小图,非常适合写分析报告。

值不值得学?

如果你:

  • 经常在 Matplotlib 里拼图拼得抓狂
  • 觉得 subplot 太死板
  • 讨厌 gridspec 那些难记又容易出错的参数

那 patchworklib 简直是救你狗命的存在。

语法简单得离谱,但能力却是 Matplotlib 原生 API 的几倍体验。

-END-

我为大家打造了一份RPA教程,完全免费:songshuhezi.com/rpa.html

🔥虎哥私藏精品🔥

虎哥作为一名老码农,整理了全网最全《python高级架构师资料合集》,总量高达650GB。