首页 > 解决方案 > 在 line2D [matplotlib] 的 pick 事件中一次获取选中的行

问题描述

问题

我无法在 line2D 的 pick 事件中一次获得所有选中的行。

我正在使用 tkinter 创建交互式折线图。图中的每条线都可能相互重叠。但是,当我尝试使用 canvas 的 pick 事件来获取用户单击的多条重叠行时,会为每一行单独调用 pick 事件。如何让用户一次单击多条重叠线?

还有,虽然增加了调用pick事件的pickradius的值,但似乎并没有让pick事件的调用变得更容易。如何增加pick事件的调用范围呢?

请指教。

代码

import matplotlib.pyplot as plt
import numpy as np
import tkinter as tk
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2Tk
from matplotlib.lines import Line2D
from tkinter import messagebox

# graph pick event
def pickLine2D(event):
    print('pick evnet')
    global lines
    artist = event.artist
    if isinstance(artist, Line2D):
        if artist in lines:
            idx = lines.index(artist)
            print(f'line idx : {idx}')

# close window
def _windowDestroy(root):
    root.quit()
    root.destroy()

root = tk.Tk()
root.geometry('700x500')
root.title('graph window')
root.protocol('WM_DELETE_WINDOW', lambda root=root: _windowDestroy(root))

f = tk.Frame(root)
f.pack(side=tk.TOP, fill=tk.BOTH, expand=True)

# data of graph
N = 2
M = 10
x = np.arange(M)
np.random.seed(seed=0)
lines = []

# set graph
fig = plt.figure(figsize=(4, 4))
cvs = FigureCanvasTkAgg(fig, f)
toolbar = NavigationToolbar2Tk(cvs, f)
cvs.get_tk_widget().pack(fill=tk.BOTH, expand=True)

# set lien2D
ax = fig.add_subplot(111)
for i in range(N):
    _y = np.random.rand(M)
    line = Line2D(x, _y, picker=True, pickradius=10)
    lines.append(line)
    ax.add_line(line)
ax.set_xlim((-0.5, M + 0.5))
ax.set_ylim((0, 1.5))

fig.canvas.mpl_connect('pick_event', pickLine2D)

root.mainloop()

环境

环境如下

标签: pythonmatplotlibtkinter

解决方案


推荐阅读