如何解决Matplotlob set_position() 不适用于具有 constrained_layout 的子图
我有一组 4 个子图,其中在第一个子图中指定了纵横比。我从 this Github thread(这真的很有帮助)了解到“sharex 只是意味着他们共享他们的 x 数据限制。”
我无法实现该线程上推荐的 get_position()
和 set_position()
,因此我尝试了获取 ax2
位置并将其设置为自身的简单测试。为什么ax2移动了?我认为它不应该移动,这种行为是意外的。
这里的基本问题是,考虑到第一个子图中定义的方面的初始约束,我怎样才能让我的子图 x 轴“排列”以使宽度相同。我不能只定义其他子图中的方面,因为它们使用不同的 y 轴。
使用 Python 3.8
fig = plt.figure(figsize=(3,5),constrained_layout=True)
gs = fig.add_gridspec(4,1)
ax1 = fig.add_subplot(gs[0,0],aspect=0.7)
ax2 = fig.add_subplot(gs[1,sharex=ax1,sharey=ax1)
ax3 = fig.add_subplot(gs[2,sharex=ax1)
ax4 = fig.add_subplot(gs[3,sharey=ax3)
pos2 = ax2.get_position().bounds
ax2.set_position(pos2)
解决方法
这似乎是由于使用了 constrained_layout
,matplotlib 声明为 "experimental"。但是,他们确实声明使用 set_position
将手动放置 Axes 对象而不受约束布局的影响:
手动调用 set_position
将设置轴,因此 constrained_layout 不再对其产生影响。
您可以使用 fig.execute_constrained_layout()
来解决这个问题:
fig = plt.figure(figsize=(3,5),constrained_layout=True)
gs = fig.add_gridspec(4,1)
ax1 = fig.add_subplot(gs[0,0],aspect=0.7)
ax2 = fig.add_subplot(gs[1,sharex=ax1,sharey=ax1)
ax3 = fig.add_subplot(gs[2,sharex=ax1)
ax4 = fig.add_subplot(gs[3,sharey=ax3)
fig.execute_constrained_layout()
pos2 = ax2.get_position().bounds
ax2.set_position(pos2)
如果您只想避免受限布局,您可以尝试使用 tight_layout
。在获得职位之前打这个电话。
fig = plt.figure(figsize=(3,5)) # constrained_layout is False by default
gs = fig.add_gridspec(4,sharey=ax3)
fig.tight_layout() # reconfigure layout before getting positions
pos2 = ax2.get_position().bounds
ax2.set_position(pos2)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。