matplotlib: обработка событий и навигация для внутренних осей

Чтобы отобразить один график поверх другого, я могу либо

  1. использовать два топора и играть с zorder
  2. или используйте вместо этого внутренние оси
import matplotlib.pyplot as plt

fig = plt.figure()

ax0 = fig.add_axes([0.1,0.1,0.8,0.8], zorder=1)
ax0.set_title('ax0')

ax1 = fig.add_axes([0.175,0.5,0.3,0.3], zorder=2)
ax1.set_title('ax1')
ax1.set_facecolor('lightgray')
ax1.set_xlim(2,3)
ax1.set_ylim(2,3)

ax2 = ax0.inset_axes([0.575, 0.5, 0.375, 0.375])
ax2.set_title('ax2')
ax2.set_facecolor('gray')
ax2.set_xlim(4,5)
ax2.set_ylim(4,5)

plt.show()

К сожалению, оба варианта демонстрируют нестабильное взаимодействие:

  1. ax1 показывает правильную информацию на панели навигации и позволяет масштабировать / панорамировать (хорошо). Однако оси фона ax0 также масштабируются и панорамируются (не очень хорошо).
  2. ax2 полностью игнорируется, т.е. информация о навигационной панели и масштабирование / панорамирование работают только для ax0

Вопрос: Есть ли простой способ отключить информацию / масштабирование / панорамирование для ax0 всякий раз, когда событие мыши находится внутри ax1 или ax2, или мне нужно пережить боль перезаписи функций событий и выполнения преобразований координат на основе на ограничивающих прямоугольниках ax1 / ax2 или даже подкласса панели навигации?

PS: мне нужно только 1. или 2. для работы, а не оба. 1. кажется, было бы ближе к запрошенному поведению, если бы я мог просто выключить / включить ax0, как я хочу ...


person Greg814    schedule 02.12.2020    source источник


Ответы (2)



Ответ Дизиета Асахи, связанный с 'axes_enter_event', решает его для варианта 1. Я не мог заставить его работать прямо для осей врезки. Кроме того, теперь кажется, что zorder не важен, поэтому он удален.

Код для справки:

import matplotlib.pyplot as plt

fig = plt.figure()

ax0 = fig.add_axes([0.1,0.1,0.8,0.8])
ax0.set_title('ax0')

ax1 = fig.add_axes([0.175,0.5,0.3,0.3])
ax1.set_title('ax1')
ax1.set_facecolor('lightgray')
ax1.set_xlim(2,3)
ax1.set_ylim(2,3)

def enter_axes(event):
    if not event.inaxes:
        return
    if event.inaxes == ax1:
        ax0.set_navigate(False)
    elif event.inaxes == ax0:
        ax0.set_navigate(True)

fig.canvas.mpl_connect('axes_enter_event', enter_axes)

plt.show()
person Greg814    schedule 03.12.2020