Matplotlib/Seaborn循环创建子图sharey行模式下set_yticks仅最后一个子图生效问题
问题原因
这个现象是matplotlib共享坐标轴的默认特性导致的:当你设置sharey='row'时,同一行的所有子图会共用一组y轴刻度规则,默认只有行首的第一个子图的坐标轴是主控轴,其余子图的坐标轴和主控轴绑定。
你在循环中逐一对第一行的4个子图执行set(yticks=range(0,70,10))操作时,前3次修改的都是非主控轴的刻度,由于共享绑定机制,这些修改会被主控轴的默认规则覆盖而不生效。当执行到最后一个子图axes[0,3]的修改操作时,相当于强制修改了该子图的刻度规则,触发了共享关系解绑,所以只有最后一个子图的刻度符合你的设置,前面3个子图仍然沿用初始的主控轴默认刻度。
推荐解决方案
只需要修改第一行的主控轴(也就是行首第一个子图)的刻度即可,整行共享轴的子图都会自动同步该设置,不需要在循环里逐个设置,修改逻辑如下:
- 删掉第一行循环里的
axes[0, i].set(yticks=range(0,70,10))代码 - 在第一行的循环结束后,新增一行代码:
axes[0, 0].set(yticks=range(0, 70, 10))
备选方案(适用于需要取消共享轴的场景)
如果你确实需要取消行内y轴共享,只要在设置sharey=False后,统一给第一行所有子图设置相同的ylim和yticks,就能保证刻度统一,也不会打乱第二行的布局:
# 第一行循环结束后统一设置 for i in range(4): axes[0, i].set(ylim=(0, 60), yticks=range(0,70,10))
内容的提问来源于stack exchange,提问作者cjstevens
相关产品推荐
相关产品推荐

