如何将多个matplotlib.figure.Figure对象合并为单个图形
合并两个Matplotlib Figure为单个Figure的子图
要实现将两个独立返回的matplotlib.figure.Figure合并为一个新Figure的子图,有两种可行方案,分别适用于矢量格式保留和快速实现场景:
方案一:保留矢量格式(移植原Axes到新Figure)
该方案会将原Figure中的所有坐标轴(Axes)直接移植到新Figure的子图区域,保留矢量图形的可编辑特性:
代码示例
import matplotlib.pyplot as plt from matplotlib.transforms import Bbox # 模拟返回Figure的函数(替换为你的实际函数) def generate_figure1(): fig, axes = plt.subplots(2, 2, figsize=(6, 4)) axes[0,0].plot([1, 2, 3], label="Line") axes[0,1].scatter([1, 2], [3, 4], color="red") axes[1,0].bar([1, 2], [5, 6], color="green") axes[1,1].pie([1, 2, 3], labels=["A", "B", "C"]) fig.suptitle("Original Figure 1") return fig def generate_figure2(): fig, ax = plt.subplots(figsize=(6, 4)) ax.imshow([[1, 2], [3, 4]], cmap="viridis") ax.set_title("Original Figure 2") return fig # 获取原Figure fig1 = generate_figure1() fig2 = generate_figure2() # 创建新Figure,设置2行1列的子图布局 new_fig = plt.figure(figsize=(8, 10)) # 处理第一个原Figure subplot_1 = new_fig.add_subplot(2, 1, 1) subplot_1.axis("off") # 隐藏占位子图的坐标轴 bbox_1 = subplot_1.get_position() # 获取占位子图的位置范围 fig1_w, fig1_h = fig1.get_size_inches() # 计算位置缩放比例,适配新子图区域 scale_x1 = bbox_1.width / fig1_w scale_y1 = bbox_1.height / fig1_h # 移植原Figure1的所有Axes到新Figure for ax in fig1.get_axes(): orig_pos = ax.get_position() # 转换为新Figure中的位置坐标 new_pos = Bbox.from_extents( bbox_1.x0 + orig_pos.x0 * scale_x1, bbox_1.y0 + orig_pos.y0 * scale_y1, bbox_1.x0 + orig_pos.x1 * scale_x1, bbox_1.y0 + orig_pos.y1 * scale_y1 ) ax.set_position(new_pos) new_fig.add_axes(ax) # 处理第二个原Figure subplot_2 = new_fig.add_subplot(2, 1, 2) subplot_2.axis("off") bbox_2 = subplot_2.get_position() fig2_w, fig2_h = fig2.get_size_inches() scale_x2 = bbox_2.width / fig2_w scale_y2 = bbox_2.height / fig2_h for ax in fig2.get_axes(): orig_pos = ax.get_position() new_pos = Bbox.from_extents( bbox_2.x0 + orig_pos.x0 * scale_x2, bbox_2.y0 + orig_pos.y0 * scale_y2, bbox_2.x0 + orig_pos.x1 * scale_x2, bbox_2.y0 + orig_pos.y1 * scale_y2 ) ax.set_position(new_pos) new_fig.add_axes(ax) # 关闭原Figure,避免额外弹出窗口 plt.close(fig1) plt.close(fig2) # 显示新合并的Figure plt.show()
方案二:快速实现(渲染为图像后显示)
如果不需要保留矢量格式,可将原Figure渲染为位图图像,再在新Figure的子图中显示,操作更简单:
代码示例
import matplotlib.pyplot as plt # 模拟返回Figure的函数 def generate_figure1(): fig, axes = plt.subplots(2, 2, figsize=(6, 4)) axes[0,0].plot([1, 2, 3]) axes[0,1].scatter([1, 2], [3, 4]) axes[1,0].bar([1, 2], [5, 6]) axes[1,1].pie([1, 2, 3]) fig.suptitle("Original Figure 1") return fig def generate_figure2(): fig, ax = plt.subplots(figsize=(6, 4)) ax.imshow([[1, 2], [3, 4]]) ax.set_title("Original Figure 2") return fig # 获取原Figure fig1 = generate_figure1() fig2 = generate_figure2() # 将原Figure渲染为RGBA图像 fig1.canvas.draw() img1 = fig1.canvas.buffer_rgba() fig2.canvas.draw() img2 = fig2.canvas.buffer_rgba() # 创建新Figure和子图 new_fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(8, 10)) # 在子图中显示原Figure的图像 ax1.imshow(img1) ax1.axis("off") # 隐藏坐标轴,只显示原Figure内容 ax2.imshow(img2) ax2.axis("off") # 关闭原Figure plt.close(fig1) plt.close(fig2) plt.show()
内容的提问来源于stack exchange,提问作者Chrisanto Sinatra
相关产品推荐
相关产品推荐

