На холсте 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" и самостоятельно выяснить, произошел ли щелчок в месте, которое покрыто линией. Это немного сложнее, чем использование встроенного средства выбора.
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 для всех четырех строк, но я не понимаю, что они означают. Вы знаете объяснение?
Как я уже сказал, это радиус, который я установил. Вам это не нужно, если вы не хотите.
Ах! Я прочитал заметку, но не заметил изменения, извините. Использование радиуса также очень полезно!
Вероятно, есть, но это было бы намного сложнее, чем то, что у вас есть сейчас. Вы можете подключить
"button_press_event"и самостоятельно выяснить, произошел ли щелчок в месте, которое покрыто линией.