Python实现同刻度、对齐Y轴零点的不同尺寸子图
Python实现同刻度、对齐Y轴零点的不同尺寸子图
嘿,我明白你想要实现的效果了——把不同海拔的钻井数据子图和主图Y轴对齐,保持相同刻度,还得是不同尺寸的布局对吧?这其实用Matplotlib的GridSpec配合轴共享就能搞定,我给你捋个具体的实现思路和代码示例:
核心思路
- 用
GridSpec自定义子图的布局比例,让主图占据更大空间,三个子图按需求分配不同尺寸 - 让所有子图共享主图的Y轴,确保刻度完全一致,同时强制Y轴零点对齐
- 手动统一所有子图的Y轴范围,避免因数据范围不同导致的偏移
代码示例
import matplotlib.pyplot as plt from matplotlib.gridspec import GridSpec import numpy as np # 模拟钻井数据 # 主图数据 main_y = np.linspace(-500, 300, 100) main_x = np.random.randn(100).cumsum() # 子图数据(不同海拔区间) sub1_y = np.linspace(100, 300, 50) sub1_x = np.random.randn(50).cumsum() sub2_y = np.linspace(-200, 100, 60) sub2_x = np.random.randn(60).cumsum() sub3_y = np.linspace(-500, -100, 70) sub3_x = np.random.randn(70).cumsum() # 创建画布和GridSpec布局 fig = plt.figure(figsize=(10, 8)) # 定义GridSpec:4行1列,高度比例分别为主图、子图1、子图2、子图3的比例 gs = GridSpec(4, 1, height_ratios=[4, 1, 1, 1], hspace=0.1) # 创建主图,作为Y轴共享的基准 main_ax = fig.add_subplot(gs[0]) main_ax.plot(main_x, main_y) main_ax.set_ylabel('海拔(m)') main_ax.set_title('钻井数据对比') # 创建子图1,共享主图的Y轴 sub1_ax = fig.add_subplot(gs[1], sharey=main_ax) sub1_ax.plot(sub1_x, sub1_y, color='orange') # 隐藏子图的Y轴刻度,避免重复显示 plt.setp(sub1_ax.get_yticklabels(), visible=False) # 创建子图2,共享主图的Y轴 sub2_ax = fig.add_subplot(gs[2], sharey=main_ax) sub2_ax.plot(sub2_x, sub2_y, color='green') plt.setp(sub2_ax.get_yticklabels(), visible=False) # 创建子图3,共享主图的Y轴 sub3_ax = fig.add_subplot(gs[3], sharey=main_ax) sub3_ax.plot(sub3_x, sub3_y, color='red') # 强制所有子图的Y轴范围和主图一致,确保零点对齐 all_axes = [main_ax, sub1_ax, sub2_ax, sub3_ax] for ax in all_axes: ax.set_ylim(main_ax.get_ylim()) plt.tight_layout() plt.show()
关键细节说明
height_ratios参数可以灵活调整每个子图的高度,你可以根据自己的需求修改比例数值sharey=main_ax让所有子图共享主图的Y轴刻度,这样刻度会自动同步,零点自然对齐- 隐藏子图的Y轴刻度是为了避免重复显示,让布局更整洁
- 手动设置
ylim是为了确保即使子图数据范围较小,也会和主图保持完全一致的Y轴范围,不会出现偏移
你之前用GridSpec没成功,大概率是没处理好轴共享和Y轴范围的统一,试试这个方法应该能解决问题。如果需要更灵活的横向布局,也可以调整GridSpec的行列设置,核心逻辑都是一样的。
备注:内容来源于stack exchange,提问作者Geologist
相关产品推荐
相关产品推荐

