Как включить функцию при активированном приближении matplotlibs к прямоугольнику? - PullRequest
0 голосов
/ 21 января 2019

На холсте tkinter я добавил панель навигации matplotlib и нанес на экран несколько линий, которые я хочу выбрать и изменить, используя функцию. Я также хочу иметь возможность увеличивать изображение на холсте и выбирать линии, не активируя и не отключая «масштабирование по прямоугольнику» каждый раз, когда я хочу выполнить указанную функцию. Есть ли способ одновременно использовать функцию масштабирования matplotlib и мою определенную функцию?

import sys
if sys.version_info[0] < 3:
    import Tkinter as Tk
else:
    import tkinter as Tk
from matplotlib.figure import Figure
import numpy as np
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2Tk

root = Tk.Tk()
fig = Figure()
ax = fig.add_subplot(111)

canvas = FigureCanvasTkAgg(fig, master=root)
nav = NavigationToolbar2Tk(canvas, root)
canvas.get_tk_widget().pack(side=Tk.TOP, fill=Tk.BOTH, expand=1)
canvas._tkcanvas.pack(side=Tk.TOP, fill=Tk.BOTH, expand=1)

x = np.arange(10)
ax.plot(x, x, picker=True)
ax.plot(x, 2 * x, picker=True)
ax.plot(x, 3 * x, picker=True)
ax.plot(x, 4 * x, picker=True)

def _onPick(event):
    thisline = event.artist
    thisline.set_linewidth(5)
    fig.canvas.draw()

fig.canvas.callbacks.connect('pick_event', _onPick)

root.mainloop()

1 Ответ

0 голосов
/ 21 января 2019

Вы можете подключить "button_press_event" и узнать сами, произошел ли щелчок в месте, покрытом линией.Это немного сложнее, чем использование встроенного средства выбора.

x = np.arange(10)
ax.plot(x, x, picker=6)
ax.plot(x, 2 * x, picker=6)
ax.plot(x, 3 * x, picker=15)
ax.plot(x, 4 * x, picker=1)

def _onPick(event):
    update = False
    if event.inaxes == ax:
        for line in ax.lines:
             if line.get_picker():
                 cont, ind = line.contains(event)
                 if cont:
                     line.set_linewidth(5)
                     update=True
    if update:
        fig.canvas.draw_idle()

fig.canvas.callbacks.connect('button_press_event', _onPick)

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...