如何遍历DataFrame列将散点图按网格排列为子图?
如何将逐列生成的散点图调整为网格布局
你原有代码会为DataFrame的每一列单独弹出一个独立散点图窗口,原代码如下:
import pandas as pd import matplotlib.pyplot as plt df = pd.read_csv('test_data.csv') y = df['a'] col=['a','b','c','d','e','f','g'] for i in col[1:]: plt.figure() plt.scatter(df[i], y) plt.show()
调整方案
不要在循环内每次新建画布,提前通过plt.subplots()定义好网格布局的子图数组,循环时依次在对应子图上绘图即可。
以你需要绘制的6个散点图(对应col[1:]的b到g共6列)为例,采用2行3列网格排布的调整后代码如下:
import pandas as pd import matplotlib.pyplot as plt df = pd.read_csv('test_data.csv') y = df['a'] col = ['a','b','c','d','e','f','g'] plot_columns = col[1:] # 定义网格行列数,2行3列刚好容纳6张子图 n_row = 2 n_col = 3 # 初始化画布和子图网格,设置合适的整体画布大小 fig, axes = plt.subplots(nrows=n_row, ncols=n_col, figsize=(12, 7)) # 将二维的子图轴数组展平为一维,方便循环按顺序索引 axes = axes.flatten() for idx, col_name in enumerate(plot_columns): current_ax = axes[idx] current_ax.scatter(df[col_name], y) # 给每个子图加上轴标签,方便识别对应列 current_ax.set_xlabel(col_name) current_ax.set_ylabel('a') # 自动调整子图间距,避免标签、内容重叠 plt.tight_layout() plt.show()
自定义调整说明
- 如果需要更换网格比例,比如改成3行2列,只需要修改
n_row和n_col的数值即可,保证两个数值的乘积大于等于待绘制的子图总数量 - 如果网格存在多余的空白子图,可以拿到对应子图的轴对象后调用
.axis('off')隐藏 - 可以通过修改
figsize参数调整整体画布的宽高,适配不同的展示需求
内容的提问来源于stack exchange,提问作者L_Horner
相关产品推荐
相关产品推荐

