Matplotlib实现X轴双断口及轴长按区间比例缩放问题求助
解决方案
1 brokenaxes报错处理
该报错是brokenaxes库与3.7及以上版本Matplotlib不兼容导致,两种解决方式:
- 降级Matplotlib到3.6.x版本,执行命令:
pip install matplotlib==3.6.3,即可正常运行官方示例 - 直接使用原生Matplotlib实现需求,无需依赖第三方库,可控性更高
2 原生Matplotlib实现双断口X轴图表
以下完整代码可同时满足双断口、子图宽度与X轴区间长度成正比的要求:
import numpy as np import matplotlib.pyplot as plt # 生成测试数据 days = list(range(0,500)) values = list(np.random.randint(low = 10,high=100,size=len(days))) # 定义三个X轴区间的长度,用于设置子图宽度比例 x_range_len = [100, 50, 100] # 对应0-100、250-300、400-500的区间长度 fig, (ax1, ax2, ax3) = plt.subplots(1, 3, sharey=True, facecolor='w', gridspec_kw={'width_ratios': x_range_len}, figsize=(7,5)) # 三个子图都绘制相同数据 ax1.plot(days, values) ax2.plot(days, values) ax3.plot(days, values) # 分别设置三个子图的X轴显示范围 ax1.set_xlim(0, 100) ax2.set_xlim(250, 300) ax3.set_xlim(400, 500) # 隐藏相邻子图的重叠脊线 ax1.spines['right'].set_visible(False) ax2.spines['left'].set_visible(False) ax2.spines['right'].set_visible(False) ax3.spines['left'].set_visible(False) # 调整刻度显示,仅最左侧子图显示Y轴刻度 ax1.yaxis.tick_left() ax2.tick_params(axis='y', left=False, labelleft=False) ax3.tick_params(axis='y', left=False, labelleft=False) # 绘制断口处的斜线标记 d = .015 # 斜线大小 kwargs = dict(transform=ax1.transAxes, color='k', clip_on=False) # 第一个子图右侧断口斜线 ax1.plot((1-d,1+d), (-d,+d), **kwargs) ax1.plot((1-d,1+d),(1-d,1+d), **kwargs) # 第二个子图左右两侧断口斜线 kwargs.update(transform=ax2.transAxes) ax2.plot((-d,+d), (1-d,1+d), **kwargs) ax2.plot((-d,+d), (-d,+d), **kwargs) ax2.plot((1-d,1+d), (1-d,1+d), **kwargs) ax2.plot((1-d,1+d), (-d,+d), **kwargs) # 第三个子图左侧断口斜线 kwargs.update(transform=ax3.transAxes) ax3.plot((-d,+d), (1-d,1+d), **kwargs) ax3.plot((-d,+d), (-d,+d), **kwargs) # 调整子图间距 plt.subplots_adjust(wspace=0.05) plt.show()
如果需要调整X轴区间,只需修改对应set_xlim的参数,同步更新x_range_len列表里的区间长度即可自动适配子图宽度。
内容的提问来源于stack exchange,提问作者volc_nerd
相关产品推荐
相关产品推荐

