并排组合两个 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()
我制作了两个 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()