Matplotlib 多子图高级布局与组合可视化实战
在数据分析与学术可视化中,单一图表往往难以承载复杂的分析逻辑与多维度数据对比需求。多子图高级布局与组合可视化,能够将不同类型的图表(如柱状图、折线图、直方图)整合在同一画布中,实现数据特征的全方位、多层次呈现,是学术论文、分析报告中提升信息密度与专业性的核心技巧。
一、多子图高级布局:摆脱固定行列限制
前文介绍的多子图的为简单行列布局(如1行2列、2行2列),适用于少量子图的场景。当子图数量较多、类型各异时,固定行列布局会导致图表拥挤、排版杂乱。Matplotlib提供的GridSpec(网格规格)工具,可实现灵活的非均匀布局,支持子图跨行列合并、自定义子图大小,完美适配复杂组合可视化需求。
GridSpec的核心逻辑是先将画布划分为指定行数和列数的网格,再通过指定子图占据的行数与列数,实现非均匀布局。这种方式无需受限于固定行列,可根据图表重要性调整子图尺寸,让核心图表占据更大视觉空间,次要图表适度缩小,提升整体排版的合理性与可读性。
import matplotlib.pyplot as plt
import numpy as np
from matplotlib.gridspec import GridSpec
# 全局可视化配置
plt.rcParams.update({
'font.sans-serif': ['SimHei', 'Arial Unicode MS'],
'axes.unicode_minus': False,
'figure.figsize': (15, 10) # 适配多子图的宽屏画布
})
# 生成模拟数据
np.random.seed(0)
x = np.linspace(0, 10, 50)
y1 = np.sin(x)
y2 = np.cos(x)
data_hist = np.random.normal(0, 1, 500)
data_bar = [12, 19, 15, 22, 18]
labels_bar = ['A', 'B', 'C', 'D', 'E']
# 1. 创建GridSpec网格(3行3列)
gs = GridSpec(3, 3, figure=plt.gcf())
# 2. 分配子图位置,实现非均匀布局
# 子图1:占据第1行、1-3列(跨3列),核心折线图
ax1 = plt.subplot(gs[0, :])
ax1.plot(x, y1, color='#1f77b4', linewidth=2, label='sin(x)')
ax1.plot(x, y2, color='#ff7f0e', linewidth=2, label='cos(x)')
ax1.set_title('核心趋势图(跨3列)', fontsize=14, fontweight='bold')
ax1.legend()
ax1.grid(alpha=0.3, linestyle='--')
# 子图2:占据第2行、1-2列(跨2列),直方图
ax2 = plt.subplot(gs[1, :2])
ax2.hist(data_hist, bins=25, color='#2ca02c', alpha=0.7, edgecolor='black', linewidth=0.8)
ax2.set_title('数据分布直方图(跨2列)', fontsize=12, fontweight='bold')
ax2.set_xlab









