Кнопка matplotlib не работает, когда во вложенном GridSpec - PullRequest
2 голосов
/ 09 января 2020

Я пытаюсь использовать 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()

Пока все работает нормально, кнопка меняет цвет при наведении, и при нажатии выполняется обратный вызов, вот изображение кнопки, работающей нормально при создании с осями сверху. -уровень GridSpe c

image

Теперь, когда я пытаюсь вложить GridSpecs, то есть

ax2 = fig.add_subplot(gs[1, 0])

заменяется на

gs2 = gs[1, 0].subgridspec(1, 2)
ax2 = fig.add_subplot(gs2[0, 1])

макет по желанию,

image

, но кнопка не работает (без изменения цвета при наведении, нет реакция на клик).

Пробовал plt.sca(ax2), без изменений. Интересно, когда вынимаю constrained_layout=True, кнопка работает.

Это ошибка или что здесь происходит? Кто-нибудь может пролить свет на это?

Пожалуйста, не предлагайте использовать tight_layout() и / или subplots_adjust(). Выше приведен лишь минимальный пример, в реальной жизни у меня довольно сложная фигура со множеством сюжетов и несколькими кнопками. Чтобы избежать наложения этикеток et c. Мне нужно constrained_layout. Узкий_прием имеет ограничения (например, не учитывает все элементы должным образом, например, figure.suptitle ()). Ограниченный_лией вместе с вложенным GridSpe c казался хорошим решением, за исключением проблемы выше.

Спасибо за любую помощь!

1 Ответ

1 голос
/ 09 января 2020

В качестве обходного решения 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...