Зум перестает работать после нажатия кнопки «1», но только в субплоте - PullRequest
0 голосов
/ 12 июня 2018

Я разрабатываю простой графический интерфейс для анализа некоторых данных с использованием собственной обработки событий Matplotlib .В целом это прекрасно работает, но я последние несколько часов ломал голову над какой-то странной ошибкой.

Код ниже - сильно вырубленная версия моего реального приложения.Это работает так, что вы можете нажать на изображение, чтобы добавить или удалить точки, щелкая левой и правой кнопкой мыши.Этот «режим редактирования» можно включать и выключать, нажимая клавиши «0» и «1».

Это прекрасно работает, когда изображение является единственным подзаговором.Ошибка состоит в том, что если изображение является одним из нескольких вспомогательных сюжетов, кнопка масштабирования Matplotlib перестает работать, как только вы включаете режим редактирования (нажатием кнопки «1», которая устанавливает функцию on_click в качестве обработчика для button_press_event).После этого нажатие кнопки «o» или кнопки масштабирования изменяет курсор, но прямоугольник для области масштабирования больше не отображается.Я полагаю, что обработчик каким-то образом портится с внутренностями Matplotlib.

Кто-нибудь понимает, почему масштабирование продолжает работать в случае одного вспомогательного участка, но перестает работать при установке обработчика on_click в случае нескольких вспомогательных участков? .Для переключения между рабочей и ошибочной версией прокомментируйте / раскомментируйте указанные строки, которые генерируют фигуру и подзаговор (ы).Я использую Python 2.7.14 и Matplotlib 2.2.2, оба из Anaconda.

import numpy as np
import matplotlib.pyplot as plt

class Points(object):
    def __init__(self, ax):
        self.ax = ax

        # make dummy plot, points will be added later
        self.dots, = ax.plot([], [], '.r')
        self.x = []
        self.y = []

    def onclick(self, event):
        print 'point.onclick'
        # only handle clicks in the relevant axis
        if event.inaxes is not self.ax:
            print 'outside axis'
            return

        # add point with left button
        if event.button == 1:
            self.x.append(event.xdata)
            self.y.append(event.ydata)

        # delete point with right button
        if event.button == 3 and len(self.x) > 0:
            imn = np.argmin((event.xdata - self.x)**2 + (event.ydata - self.y)**2)
            del self.x[imn]
            del self.y[imn]

        self.dots.set_data(self.x, self.y)
        plt.draw()

#### THIS WORKS ####
fig, ax3 = plt.subplots()
####################

#### THIS DOES NOT WORK ####
# fig, [[ax1, ax2], [ax3, ax4]] = plt.subplots(2, 2)
############################

ax3.imshow(np.random.randn(10, 10))
ax3.set_title('Press 0/1 to disable/enable editing points')

points = Points(ax3)

# initial state
cid_click = None
state = 0

def on_key(event):
    global cid_click, state
    print 'you pressed %r' % event.key

    if event.key in '01':
        if cid_click is not None:
            print 'disconnect cid_click', cid_click
            fig.canvas.mpl_disconnect(cid_click)
            cid_click = None

        state = int(event.key)
        if state:
            print 'connect'
            cid_click = fig.canvas.mpl_connect('button_press_event', points.onclick)

    # plt.draw()
    print 'state = %i, cid = %s' % (state, cid_click)

cid_key = fig.canvas.mpl_connect('key_press_event', on_key)

plt.show()

1 Ответ

0 голосов
/ 13 июня 2018

Это одна из самых странных ошибок, с которыми я сталкивался до сих пор.Проблема связана с нажатием клавиши 1 .Это, по неизвестной причине, кажется, убивает обратный вызов для других событий.Я создал отчет об ошибке .

. На данный момент решение состоит в том, чтобы не использовать ключ 1 , а, например, a / d ключи (для активации / деактивации).

# initial state
cid_click = None
state = "d"

def on_key(event):
    global cid_click, state
    print 'you pressed %r' % event.key

    if event.key in 'ad':
        if cid_click is not None:
            print 'disconnect cid_click', cid_click
            fig.canvas.mpl_disconnect(cid_click)
            cid_click = None

        state = event.key
        if state == "a":
            print 'connect'
            cid_click = fig.canvas.mpl_connect('button_press_event', points.onclick)

    print 'state = %s, cid = %s' % (state, cid_click)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...