如何设置matplotlib子图固定尺寸,循环生成子图时自动适配?
这个需求完全可以实现,matplotlib的Figure对象不是完全静态的,可以动态调整尺寸。你之前调用axs[index, 0].set_size_inches不生效,是因为这个方法是Figure对象的专属方法,作用是调整整个画布的尺寸,不能用来设置单个子图的大小。
方案1:可提前获取子图总数量的场景
如果你的some_list_with_information是一次性生成的、可以提前拿到长度,最简单的方案是在初始化画布时直接按单张子图的尺寸计算总画布尺寸:
import matplotlib.pyplot as plt import numpy as np x = np.linspace(0, 2 * np.pi, 400) y = np.sin(x ** 2) some_list_with_information = [item for item in range(10)] # 自定义单张子图的宽高,单位为英寸 per_w = 8 per_h = 3 col_count = 2 row_count = len(some_list_with_information) # 计算总画布尺寸,额外预留的数值为边距和子图间隙,可根据需求调整 total_width = col_count * per_w + 1.5 # 左右边距共1.5英寸 total_height = row_count * per_h + 0.5 * (row_count + 1) # 上下边距+行间隙各0.5英寸 # 初始化画布时直接指定总尺寸,同步设置子图间隙参数 fig, axs = plt.subplots( row_count, col_count, figsize=(total_width, total_height), gridspec_kw={"hspace": 0.2, "wspace": 0.15} ) for index, item in enumerate(some_list_with_information): axs[index, 0].plot(x, y) axs[index, 0].set_title(f'第{index}行左子图') axs[index, 1].plot(x, y, 'tab:orange') axs[index, 1].set_title(f'第{index}行右子图') plt.tight_layout() plt.show()
方案2:完全动态追加子图的场景
如果提前完全不知道总子图数量,比如遍历未知长度的流数据、需要动态判断是否新增子图,可以逐行添加子图后实时调整画布尺寸:
import matplotlib.pyplot as plt import numpy as np x = np.linspace(0, 2 * np.pi, 400) y = np.sin(x ** 2) # 模拟长度未知的迭代场景 def unknown_length_iter(): for i in range(7): yield i per_w = 8 per_h = 3 col_count = 2 current_row = 0 fig = plt.figure() for item in unknown_length_iter(): current_row += 1 # 新增当前行的两个子图 ax_left = fig.add_subplot(current_row, col_count, current_row * 2 - 1) ax_right = fig.add_subplot(current_row, col_count, current_row * 2) # 绘图逻辑 ax_left.plot(x, y) ax_left.set_title(f'第{current_row-1}行左子图') ax_right.plot(x, y, 'tab:orange') ax_right.set_title(f'第{current_row-1}行右子图') # 实时调整画布总尺寸 new_total_width = col_count * per_w + 1.5 new_total_height = current_row * per_h + 0.5 * (current_row + 1) fig.set_size_inches(new_total_width, new_total_height) plt.tight_layout() plt.show()
如果需要更精准的固定子图显示尺寸,避免标题、坐标轴标签挤占子图空间,可以额外调用ax.set_box_aspect(per_h/per_w)固定每个子图的宽高比,配合画布尺寸调整就能实现子图尺寸完全固定。
内容的提问来源于stack exchange,提问作者Uwe.Schneider
相关产品推荐
相关产品推荐

