Обработка клика мышки по графику в Matplotlib

Мне нужно, что бы при нажатии на plot у меня ставилась точка.
Есть вот такой код, все работает, но тут программа реагирует на абсолютно любой клик по графику, даже когда мы, например, зумим график.

Как это исправить?

from matplotlib import pyplot as plt
import numpy
from matplotlib.widgets import Button

if __name__ == "__main__":
    x_pts = []
    y_pts = []

    fig, ax = plt.subplots()

    #line, = ax.plot(x_pts, y_pts, marker="o")

    scale_factor = 5
    xmin, xmax = -100, 100
    ymin, ymax = -100, 100
    plt.xlim(xmin * scale_factor, xmax * scale_factor)
    plt.ylim(ymin * scale_factor, ymax * scale_factor)


    def onpick(event):
        m_x, m_y = event.x, event.y
        x, y = ax.transData.inverted().transform([m_x, m_y])
        x_pts.append(x)
        y_pts.append(y)
        ax.plot(x, y, 'ro')
        fig.canvas.draw()


    fig.canvas.mpl_connect('button_press_event', onpick)

    plt.show()

Ответы (1 шт):

Автор решения: S. Nick

Попробуйте так

import numpy
from matplotlib import pyplot as plt
from matplotlib.widgets import Button


if __name__ == "__main__":
    x_pts = []
    y_pts = []
    fig, ax = plt.subplots()
    scale_factor = 5
    xmin, xmax = -100, 100
    ymin, ymax = -100, 100
    plt.xlim(xmin * scale_factor, xmax * scale_factor)
    plt.ylim(ymin * scale_factor, ymax * scale_factor)
    
    def onpick(event):
        tb = plt.get_current_fig_manager().toolbar                         # +++ 
        print(repr(tb.mode),bool(tb.mode) )                                # +++ 
        if not tb.mode:                                                    # +++ 
            m_x, m_y = event.x, event.y
            x, y = ax.transData.inverted().transform([m_x, m_y])
            x_pts.append(x)
            y_pts.append(y)
            ax.plot(x, y, 'ro')
            fig.canvas.draw()
  
    fig.canvas.mpl_connect('button_press_event', onpick)
    plt.show()

введите сюда описание изображения

→ Ссылка