Как включить функцию, когда активировано масштабирование matplotlibs до прямоугольника?

На холсте 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()

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

ImportanceOfBeingErnest 21.01.2019 12:32

Я предполагаю, что отказ от панели инструментов навигации и определение моей собственной функции масштабирования, где кнопки мыши связаны с различными функциями, может быть самым простым решением. Я просто надеялся, что есть довольно простое решение. Спасибо за ваше мнение!

Philipp 21.01.2019 12:49

... ну, не так сложно, как могла бы быть ваша пользовательская функция масштабирования. Смотрите ответ ниже.

ImportanceOfBeingErnest 21.01.2019 13:09
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
3
256
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете подключить "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)

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

Это потрясающе! После прочтения некоторых документов matplotlib все еще остается один вопрос относительно вашего кода. line.get_picker() возвращает целые числа 6, 6, 15 и 1 для всех четырех строк, но я не понимаю, что они означают. Вы знаете объяснение?

Philipp 21.01.2019 13:31

Как я уже сказал, это радиус, который я установил. Вам это не нужно, если вы не хотите.

ImportanceOfBeingErnest 21.01.2019 13:33

Ах! Я прочитал заметку, но не заметил изменения, извините. Использование радиуса также очень полезно!

Philipp 21.01.2019 13:37

Другие вопросы по теме