我正在尝试使用constrained_layout以及嵌套的GridSpecs来放置子图和按钮。这是一个最小的示例:
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
from matplotlib.widgets import Button
def on_click(event):
print("hey")
fig = plt.figure(constrained_layout=True)
gs = gridspec.GridSpec(2, 1, height_ratios=[14, 1], figure=fig)
ax1 = fig.add_subplot(gs[0, 0])
ax1.text(0.5, 0.5, "ax1", va="center", ha="center")
ax2 = fig.add_subplot(gs[1, 0])
b = Button(ax2, 'hey')
b.on_clicked(on_click)
plt.show()
到目前为止,此方法仍然可以正常工作,当鼠标悬停时按钮会更改颜色,并且在单击时执行回调,这是使用顶级GridSpec的轴创建按钮时可以正常工作的图像
现在,当我尝试嵌套GridSpecs时,即
ax2 = fig.add_subplot(gs[1, 0])
被替换为
gs2 = gs[1, 0].subgridspec(1, 2)
ax2 = fig.add_subplot(gs2[0, 1])
布局是所需的,
但按钮不起作用(悬停时无颜色变化,单击时无反应)。
尝试过plt.sca(ax2)
,没有变化。有趣的是,当我取出时constrained_layout=True
,按钮起作用。
这是错误,还是这里发生了什么?有人可以说明一下吗?
请不要建议使用tight_layout()
和/或subplots_adjust()
。上面只是一个最小的示例,在现实生活中,我有一个相当复杂的图形,其中包含许多子图和几个按钮。为了避免标签重叠等,我需要使用constrained_layout。ight_layout有局限性(例如,未正确考虑所有元素,例如Figure.suptitle())。constrained_layout以及嵌套的GridSpec似乎是一个很好的解决方案,但上述问题除外。
谢谢你的帮助!
解决方法是zorder
将新轴放置在所创建的“重影”上方constrained_layout
。
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
from matplotlib.widgets import Button
def on_click(event):
print("hey")
fig = plt.figure(constrained_layout=True)
gs = gridspec.GridSpec(2, 1, figure=fig)
ax1 = fig.add_subplot(gs[0, 0])
ax1.text(0.5, 0.5, "ax1", va="center", ha="center")
gs2 = gs[1, 0].subgridspec(1, 2)
ax2 = fig.add_subplot(gs2[0, 1])
ax2.set_zorder(10)
b = Button(ax2, 'hey')
b.on_clicked(on_click)
plt.show()
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句