如何用Matplotlib+Seaborn创建特定布局的4个子图并控制轴样式
实现指定子图布局并使用Seaborn绘图的解决方案
要实现2个横向排列的大图+右侧垂直堆叠的2个小图(总高度与大图一致)的布局,不能用两个独立画布,得用matplotlib.gridspec.GridSpec来统一控制布局,结合Seaborn绘图并自定义轴样式,代码示例如下:
import matplotlib.pyplot as plt from matplotlib.gridspec import GridSpec import seaborn as sns import numpy as np # 生成示例数据 np.random.seed(42) data1 = np.random.normal(0, 1, 100) data2 = np.random.normal(2, 1.5, 100) data3 = np.random.randint(0, 10, 50) data4 = np.random.uniform(0, 1, 50) # 创建主画布和GridSpec布局 # 宽度比例:左侧大图区域占8份,右侧小图区域占2份;高度统一为1份 fig = plt.figure(figsize=(16, 6)) gs = GridSpec(2, 3, width_ratios=[4, 4, 2], height_ratios=[1, 1]) # 提取各个子图的轴对象 ax1 = fig.add_subplot(gs[:, 0]) # 左侧大图,占满整个高度 ax2 = fig.add_subplot(gs[:, 1]) # 中间大图,占满整个高度 ax3 = fig.add_subplot(gs[0, 2]) # 右侧上方小图 ax4 = fig.add_subplot(gs[1, 2]) # 右侧下方小图 # 使用Seaborn绘图,指定对应的轴 sns.histplot(data=data1, ax=ax1, kde=True, color='skyblue') sns.histplot(data=data2, ax=ax2, kde=True, color='salmon') sns.boxplot(x=data3, ax=ax3, color='lightgreen') sns.scatterplot(x=np.arange(50), y=data4, ax=ax4, color='purple') # 自定义轴样式示例 def customize_axis(ax, title, xlabel, ylabel): ax.set_title(title, fontsize=12, fontweight='bold') ax.set_xlabel(xlabel, fontsize=10) ax.set_ylabel(ylabel, fontsize=10) # 自定义刻度样式 ax.tick_params(axis='both', labelsize=9, color='darkgray') # 隐藏右侧和顶部边框 ax.spines['right'].set_visible(False) ax.spines['top'].set_visible(False) # 应用自定义样式到每个轴 customize_axis(ax1, '数据集1分布', '数值', '频数') customize_axis(ax2, '数据集2分布', '数值', '频数') customize_axis(ax3, '数据集3箱线图', '类别', '') customize_axis(ax4, '数据集4散点图', '索引', '数值') # 调整子图间距,避免重叠 plt.tight_layout() plt.show()
关键说明:
GridSpec(2,3, width_ratios=[4,4,2], height_ratios=[1,1]):设置2行3列的网格,宽度比例控制左右区域的宽度,高度比例让右侧两个小图高度相等,总高度和左侧大图一致。- 通过
fig.add_subplot(gs[:,0])这类方式精确指定每个子图占据的网格位置,确保布局符合需求。 - Seaborn绘图时通过
ax参数指定绘图的轴,实现同一画布内的多子图绘制。 - 自定义轴样式可以通过封装函数批量处理,也可以单独对每个轴进行调整,灵活控制刻度、边框、标签等元素。
内容的提问来源于stack exchange,提问作者stasia_l
相关产品推荐
相关产品推荐

