并排组合两个 matplotlib 图形,高质量

Combine two matplotlib Figures, side by side, high quality

我制作了两个 matplotlib 图形,大小为 1000x1000。 每个图都是基于 4x4 子图的图。 我想要一个尺寸为 1000x2000 的图形(宽度为 2000)。

fig1
<Figure size 1000x1000 with 4 Axes>

fig2
<Figure size 1000x1000 with 4 Axes>

现在我想把它们组合在一起。

我搜索了很多参考资料: How to make two plots side-by-side using Python?

Adding figures to subplots in Matplotlib

它们不相关,因为它们大多建议更改初始图的创建方式。我不想更改它 - 我想按原样使用该图。

我只需要将Fig1放在Fig2的左边。不改变 Fig1 或 Fig2 的创建方式。

我也尝试过使用 PIL 方法:https://note.nkmk.me/en/python-pillow-concat-images/ 但是质量较低

您可以使用 agg 后端将图形渲染为数组。 然后并排连接数组并切换回正常后端以显示结果:

import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt

backend = mpl.get_backend()
mpl.use('agg')

dpi = 100
fig1,_ = plt.subplots(2,2, figsize=(1000/dpi, 1000/dpi), dpi=dpi)
fig1.suptitle('Figure 1')
fig2,_ = plt.subplots(2,2, figsize=(1000/dpi, 1000/dpi), dpi=dpi)
fig2.suptitle('Figure 2')

c1 = fig1.canvas
c2 = fig2.canvas

c1.draw()
c2.draw()

a1 = np.array(c1.buffer_rgba())
a2 = np.array(c2.buffer_rgba())
a = np.hstack((a1,a2))

mpl.use(backend)
fig,ax = plt.subplots(figsize=(2000/dpi, 1000/dpi), dpi=dpi)
fig.subplots_adjust(0, 0, 1, 1)
ax.set_axis_off()
ax.matshow(a)

不是直接合并两个单独的图形,而是我通过参考这个参考成功实现了最终目标: https://matplotlib.org/devdocs/gallery/subplots_axes_and_figures/subfigures.html

这就是我需要的代码:

fig = plt.figure(constrained_layout=True, figsize=(20, 11))
titles_size = 25
labels_size = 18
subfigs = fig.subfigures(1, 2, wspace=0.02)
subfigs[0].suptitle('Title 1', fontsize=titles_size)
subfigs[1].suptitle('Title 2', fontsize=titles_size)

axsLeft = subfigs[0].subplots(2, 2)
axsRight = subfigs[1].subplots(2, 2)

for ax_idx, ax in enumerate(axsLeft.reshape(-1)):
    ax.grid(False)
    ax.set_xticklabels([])
    ax.set_yticklabels([])
    ax.axes.xaxis.set_visible(False)
    ax.axes.yaxis.set_visible(False)
for ax_idx, ax in enumerate(axsRight.reshape(-1)):
    ax.grid(False)
    ax.set_xticklabels([])
    ax.set_yticklabels([])
    ax.axes.xaxis.set_visible(False)
    ax.axes.yaxis.set_visible(False)
plt.show()