def _(artist, event):
# No need to call `line.contains` because we're going to redo
# the work anyways (and it was broken for step plots up to
# matplotlib/matplotlib#6645).
# Always work in screen coordinates, as this is how we need to compute
# distances. Note that the artist transform may be different from the axes
# transform (e.g., for axvline).
xy = event.x, event.y
data_xy = artist.get_xydata()
sels = []
# If markers are visible, find the closest vertex.
if artist.get_marker() not in ["None", "none", " ", "", None]:
ds = np.hypot(*(xy - artist.get_transform().transform(data_xy)).T)
try:
argmin = np.nanargmin(ds)
dmin = ds[argmin]
except (ValueError, IndexError):
# numpy 1.7.0's `nanargmin([nan])` returns nan, so
# `ds[argmin]` raises IndexError. In later versions of numpy,
# `nanargmin([nan])` raises ValueError (the release notes for 1.8.0
# are incorrect on this topic).
pass
else:
# More precise than transforming back.
target = with_attrs(artist.get_xydata()[argmin], index=argmin)
sels.append(Selection(artist, target, dmin, None, None))
# If lines are visible, find the closest projection.
if (artist.get_linestyle() not in ["None", "none", " ", "", None]
and len(artist.get_xydata()) > 1):
sel = _compute_projection_pick(artist, artist.get_path(), xy)
if sel is not None:
sel.target.index = {
"_draw_lines": lambda _, index: index,
"_draw_steps_pre": Index.pre_index,
"_draw_steps_mid": Index.mid_index,
"_draw_steps_post": Index.post_index}[
Line2D.drawStyles[artist.get_drawstyle()]](
len(data_xy), sel.target.index)
sels.append(sel)
sel = min(sels, key=lambda sel: sel.dist, default=None)
return sel if sel and sel.dist < artist.get_pickradius() else None
评论列表
文章目录