如何在Python中动态绘制数量可变的多个子图?
动态创建Matplotlib子图(无空白布局)
核心思路
先收集所有需要绘制的有效(x,y)列对,再根据配对数量自动生成对应行数的子图布局,完全避免空白子图。
修正后的代码实现
import matplotlib.pyplot as plt # 定义所有需要检查的列配对(可根据需求扩展) plot_pairs = [ ("node_x_9", "node_x_11"), ("node_x_10", "node_x_12") # 可以继续添加其他需要的配对,比如("node_x_13", "node_x_15")等 ] # 收集有效的配对(两个列都存在于names中) valid_pairs = [] for x_col, y_col in plot_pairs: if x_col in names and y_col in names: valid_pairs.append((x_col, y_col)) # 如果有有效配对,开始绘图 n = len(valid_pairs) if n > 0: # 创建n行1列的子图,figsize可根据需求调整 fig, axes = plt.subplots(n, 1, figsize=(8, 4 * n)) # 处理单个子图的情况(此时axes不是数组) if n == 1: axes = [axes] # 逐个绘制子图 for ax, (x_col, y_col) in zip(axes, valid_pairs): ax.plot(df[x_col], df[y_col]) ax.set_title(f"{y_col} vs {x_col}") ax.set_xlabel(x_col) ax.set_ylabel(y_col) # 自动调整子图间距,避免标签重叠 plt.tight_layout() plt.show()
关键细节说明
- 动态收集配对:把所有需要检查的列对提前定义在
plot_pairs里,后续扩展只需要添加新配对即可,不用改逻辑代码。 - 自适应布局:根据有效配对数量
n创建n×1的子图,完全没有空白。如果后续需要其他布局(比如超过3个时改成2列),可以加判断:比如rows = (n + 1) // 2,cols = 2,再用plt.subplots(rows, cols)生成布局。 - 修复原代码错误:原代码里
plt.plot(df["node_x_10", "node_x_12"])是语法错误,应该拆成两个列索引df["node_x_10"], df["node_x_12"]。
内容的提问来源于stack exchange,提问作者Enri Ventu
相关产品推荐
相关产品推荐

