如何绘制两个DataFrame所有列组合的动态适配子图网格
实现方案
通过双层循环遍历两个DataFrame的所有列组合,动态计算子图网格的行列数,无需硬编码固定行列值,即可适配任意列数的输入、预测数据集。
核心逻辑
- 自动读取输入DataFrame列数作为子图网格行数,预测DataFrame列数作为子图网格列数
- 画布尺寸根据子图总数量动态缩放,避免子图拥挤、标签重叠
- 双层循环依次遍历所有输入列、预测列的两两组合,在对应子图位置绘制散点
- 自动为每个子图匹配对应标题、坐标轴标签
实现代码
import pandas as pd import numpy as np import matplotlib.pyplot as plt # 测试样例数据,实际使用时替换为你自己的输入、预测数据集即可 dummy_data = pd.DataFrame(np.random.uniform(low=65.5,high=140.5,size=(50,4)), columns=list('ABCD')) dummy_predicted = pd.DataFrame(np.random.uniform(low=15.5,high=17.5,size=(50,4)), columns=list('WXYZ')) # 动态获取数据集列数,自动计算子图网格规模 n_input_cols = len(dummy_data.columns) n_pred_cols = len(dummy_predicted.columns) # 按子图数量动态设置画布尺寸,预留足够显示空间 fig = plt.figure(figsize=(4*n_pred_cols, 3*n_input_cols)) plot_counter = 1 # 双层循环遍历所有输入列-预测列组合 for input_col in dummy_data.columns: for pred_col in dummy_predicted.columns: plt.subplot(n_input_cols, n_pred_cols, plot_counter) plt.scatter(dummy_data[input_col], dummy_predicted[pred_col], s=15) plt.title(f'{input_col} vs {pred_col}', fontsize=10) plt.xlabel(input_col, fontsize=9) plt.ylabel(pred_col, fontsize=9) plot_counter += 1 # 自动调整子图间距避免标签遮挡 plt.tight_layout() plt.show()
适配说明
- 代码不依赖固定列数:如果输入集为3列、预测集为2列,会自动生成3行2列的子图网格,无需修改其他逻辑
- 可根据自身显示需求调整
figsize的缩放系数、散点大小s、字体大小等参数 - 如果需要减少重复轴标签的冗余显示,可以在创建子图时传入
sharex=True、sharey=True参数统一坐标轴
内容的提问来源于stack exchange,提问作者Zizi96
相关产品推荐
相关产品推荐

