【发布时间】:2019-07-25 18:52:46
【问题描述】:
我正在使用 matplolib 的 Line2D 绘制多条线,并且想一次选择或选择所有线。
提供的 MWE 绘制一个三角形(可以是任何多边形或形状),并包含一个可以分别选择每条线的功能。我想通过单击它来选择整个三角形。此外,我注意到如果我添加另一行,onPick 函数根本不起作用。有谁知道我做错了什么?
编辑 正如下面的 cmets 中所建议的,我添加了一个 Polygon 和一个修改后的函数 pick_simple()(来自:https://matplotlib.org/3.1.0/gallery/event_handling/pick_event_demo.html)。但不幸的是,这带来了新的问题。通过绘制多边形,即使我设置了 fill=False 以及线宽和颜色,我也会得到一个填充的蓝色补丁。 pick_simple() 函数也没有做任何让我很困惑的事情。
from matplotlib import pyplot as plt
from matplotlib.lines import Line2D
from matplotlib.patches import Polygon
from matplotlib.collections import PatchCollection
fig = plt.figure()
ax = fig.add_subplot(111)
triangle = [[0.1, 0.3],
[0.2, 0.8],
[0.3, 0.5],
[0.1, 0.3]]
for i in range(len(triangle)-1):
tri = Line2D([triangle[i][0],triangle[i+1][0]],[triangle[i][1],
triangle[i+1][1]], linewidth=0.75, color='#F97306')
tri.set_picker(True)
ax.add_line(tri)
geometry = [[0.0,0.0],[0.1,0.05],[0.2,0.15],[0.3,0.20],[0.4,0.25],[0.5,0.30],
[0.6,0.25],[0.7,0.15],[0.8,0.05],[0.9,0.025],[1.0,0.0]]
patches = []
polygon = Polygon(geometry, closed=False, fill=False, linewidth=0.75, color='#F97306')
polygon.set_picker(True)
patches.append(polygon)
p = PatchCollection(patches)
ax.add_collection(p)
plt.show()
def pick_simple():
def onpick(event):
if isinstance(event.artist, Polygon):
patch = event.artist
print('onpick patch:', patch.get_path())
fig.canvas.mpl_connect('pick_event', onpick)
def pick_factory(ax):
def onPick(event):
if event.inaxes == ax:
for line in ax.lines:
if line.get_picker():
cont, ind = line.contains(event)
if cont:
line.set_color('#029386')
line.set_linewidth(5)
ax.figure.canvas.draw_idle()
fig = ax.get_figure() # get the figure of interest
fig.canvas.mpl_connect('button_press_event', onPick)
pick_factory(ax)
pick_simple()
【问题讨论】:
-
如果要选择一个三角形,请创建 一个 三角形,而不是 3 行。
-
我编辑了我的问题。这不是关于三角形的。它可以是任何形状。实际上它是翼型的插值,但这对于 mwe 来说已经太多了。
-
如果你想选择一个多边形,创建 一个 这样的多边形,而不是 N 行。
-
我创建了一个多边形,并尝试调整一个用于选择多边形艺术家的功能,但不幸的是,一定有很多错误。
标签: python matplotlib picker