Skip to content

Commit d67c2eb

Browse files
committed
fix transforms for VLine and HLine
1 parent d6a9c07 commit d67c2eb

File tree

1 file changed

+25
-5
lines changed

1 file changed

+25
-5
lines changed

mpl_draggable_line/_line.py

Lines changed: 25 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
from matplotlib.backend_bases import MouseEvent
77
from matplotlib.cbook import CallbackRegistry
88
from matplotlib.lines import Line2D
9+
from matplotlib.transforms import IdentityTransform, blended_transform_factory
910
from matplotlib.widgets import AxesWidget
1011

1112
__all__ = [
@@ -16,7 +17,16 @@
1617

1718

1819
class DraggableLine(AxesWidget):
19-
def __init__(self, ax, x, y, grab_range=10, useblit=False, **kwargs) -> None:
20+
def __init__(
21+
self,
22+
ax,
23+
x,
24+
y,
25+
grab_range=10,
26+
useblit=False,
27+
grab_range_transform=None,
28+
**kwargs,
29+
) -> None:
2030
"""
2131
Parameters
2232
----------
@@ -29,6 +39,9 @@ def __init__(self, ax, x, y, grab_range=10, useblit=False, **kwargs) -> None:
2939
Whether to use blitting for faster drawing (if supported by the
3040
backend). See the tutorial :doc:`/tutorials/advanced/blitting`
3141
for details.
42+
grab_range_transform : matplotlib.transform.Transform, optional
43+
The transform to use for the handle positions when calculating
44+
if a handle has been grabbed.
3245
**kwargs :
3346
Passed on to Line2D for styling
3447
"""
@@ -43,6 +56,8 @@ def __init__(self, ax, x, y, grab_range=10, useblit=False, **kwargs) -> None:
4356
marker = kwargs.pop("marker", "o")
4457
color = kwargs.pop("color", "k")
4558
transform = kwargs.pop("transform", self.ax.transData)
59+
self._grab_range_transform = grab_range_transform or self.ax.transLimits
60+
4661
self._handles = Line2D(
4762
[x[0], center_x, x[1]],
4863
[y[0], center_y, y[1]],
@@ -108,12 +123,11 @@ def _on_press(self, event: MouseEvent):
108123
if not self.canvas.widgetlock.available(self):
109124
return
110125
# figure out if any handles are being grabbed
111-
# maybe possible to do this with a pick event?
112126

113127
x, y = self._handles.get_data()
114-
# this is taken pretty much directly from the implementation
115-
# in matplotlib.widget.ToolHandles.closest
116-
pts = self.ax.transLimits.transform(np.column_stack([x, y]))
128+
# this is a modified version of
129+
# matplotlib.widget.ToolHandles.closest
130+
pts = self._grab_range_transform.transform(np.column_stack([x, y]))
117131
diff = pts - self.ax.transLimits.transform((event.xdata, event.ydata))
118132
dist = np.hypot(*diff.T)
119133
idx = np.argmin(dist)
@@ -227,6 +241,9 @@ def __init__(self, ax, x, grab_range=0.1, useblit=False, **kwargs) -> None:
227241
grab_range=grab_range,
228242
useblit=useblit,
229243
transform=ax.get_xaxis_transform(),
244+
grab_range_transform=blended_transform_factory(
245+
ax.transLimits, IdentityTransform()
246+
),
230247
**kwargs,
231248
)
232249
self._y_lock = True
@@ -292,6 +309,9 @@ def __init__(self, ax, y, grab_range=0.1, useblit=False, **kwargs) -> None:
292309
grab_range=grab_range,
293310
useblit=useblit,
294311
transform=ax.get_yaxis_transform(),
312+
grab_range_transform=blended_transform_factory(
313+
IdentityTransform(), ax.transLimits
314+
),
295315
**kwargs,
296316
)
297317
self._x_lock = True

0 commit comments

Comments
 (0)