如何实现2行2列的正确子图布局?现有绘图效果不佳
解决Matplotlib+Seaborn 2行2列子图布局问题
你的核心问题是子图布局参数设置错误加上循环逻辑有问题,导致4个特征的图挤成一团。直接看修正后的代码和说明:
修正后的代码
import matplotlib.pyplot as plt import seaborn as sns cat_features = ['Gender', 'Customer Type', 'Type of Travel', 'Class', 'satisfaction'] # 创建2行2列的子图,放大画布尺寸给每个子图足够展示空间 f, axs = plt.subplots(2, 2, figsize=(12, 8)) # 将子图数组展平为一维,和4个特征一一对应循环 for ax, col in zip(axs.flatten(), cat_features[:-1]): sns.countplot(data=df_train, x=col, hue="satisfaction", palette='Blues', ax=ax) # 给每个子图添加标题,明确展示内容 ax.set_title(f'{col} 分布与满意度关联') # 旋转x轴标签,避免长标签重叠 ax.tick_params(axis='x', rotation=45) # 自动调整子图间距,避免标题、标签互相遮挡 f.tight_layout() plt.show()
原代码的问题点
- 布局参数错误:你需要2行2列,但原代码写的是
plt.subplots(2, len(cat_features[:-1])),也就是2行4列,多余的子图挤占空间,导致有效图被过度压缩。 - 循环逻辑错误:直接遍历
axs会拿到每一行的子图数组,再用ax.flatten()[i]还用到了未定义的i,完全不符合配对逻辑,必须用axs.flatten()把二维子图数组转成一维,才能和4个特征一一对应。 - 画布尺寸太小:
figsize=(10,4)的高度不足,4个子图垂直排列时会被压得很窄,放大到(12,8)能保证每个子图的可读性。
内容的提问来源于stack exchange,提问作者SimoneA
相关产品推荐
相关产品推荐

