diff --git a/drawing_gen/.draw_path.py.swp b/drawing_gen/.draw_path.py.swp deleted file mode 100644 index 26bbfd9be5319d2a72f37da9da24071c9bd03b1f..0000000000000000000000000000000000000000 Binary files a/drawing_gen/.draw_path.py.swp and /dev/null differ diff --git a/drawing_gen/.example_draw.py.swp b/drawing_gen/.example_draw.py.swp deleted file mode 100644 index 9b10bb278d92b8826460e0aae659d6cd2025bd69..0000000000000000000000000000000000000000 Binary files a/drawing_gen/.example_draw.py.swp and /dev/null differ diff --git a/drawing_gen/draw_path.py b/drawing_gen/draw_path.py index 5e9e22c4ce712c3006157f596e7d6a8fdf7966fe..c8e3aa5a9bced96115c0c44200790773983cad0b 100644 --- a/drawing_gen/draw_path.py +++ b/drawing_gen/draw_path.py @@ -23,7 +23,13 @@ class DrawPath: if __name__ == '__main__': - + # normalize both x and y to 0-1 range + # we can multiply however we want later + # idk about the number of points, but it's large enough to draw + # a smooth curve on the screen, so it's enough for the robot to draw as well i assume + # NOTE: possible improvement: make it all bezier curves + # https://matplotlib.org/stable/users/explain/artists/paths.html + # look at the example for path handling if that's what you'll need subplot_kw = dict(xlim=(0, 1), ylim=(0, 1), autoscale_on=False) fig, ax = plt.subplots(subplot_kw=subplot_kw) diff --git a/drawing_gen/lasso_selector_demo_sgskip.py b/drawing_gen/lasso_selector_demo_sgskip.py new file mode 100644 index 0000000000000000000000000000000000000000..f5a206fdef23e14ed95719b996a2b1c5699c8c63 --- /dev/null +++ b/drawing_gen/lasso_selector_demo_sgskip.py @@ -0,0 +1,113 @@ +""" +============== +Lasso Selector +============== + +Interactively selecting data points with the lasso tool. + +This examples plots a scatter plot. You can then select a few points by drawing +a lasso loop around the points on the graph. To draw, just click +on the graph, hold, and drag it around the points you need to select. +""" + + +import numpy as np + +from matplotlib.path import Path +from matplotlib.widgets import LassoSelector + + +class SelectFromCollection: + """ + Select indices from a matplotlib collection using `LassoSelector`. + + Selected indices are saved in the `ind` attribute. This tool fades out the + points that are not part of the selection (i.e., reduces their alpha + values). If your collection has alpha < 1, this tool will permanently + alter the alpha values. + + Note that this tool selects collection objects based on their *origins* + (i.e., `offsets`). + + Parameters + ---------- + ax : `~matplotlib.axes.Axes` + Axes to interact with. + collection : `matplotlib.collections.Collection` subclass + Collection you want to select from. + alpha_other : 0 <= float <= 1 + To highlight a selection, this tool sets all selected points to an + alpha value of 1 and non-selected points to *alpha_other*. + """ + + def __init__(self, ax, collection, alpha_other=0.3): + self.canvas = ax.figure.canvas + self.collection = collection + self.alpha_other = alpha_other + + self.xys = collection.get_offsets() + self.Npts = len(self.xys) + + # Ensure that we have separate colors for each object + self.fc = collection.get_facecolors() + if len(self.fc) == 0: + raise ValueError('Collection must have a facecolor') + elif len(self.fc) == 1: + self.fc = np.tile(self.fc, (self.Npts, 1)) + + self.lasso = LassoSelector(ax, onselect=self.onselect) + self.ind = [] + + def onselect(self, verts): + path = Path(verts) + print(verts) + print(path) + self.ind = np.nonzero(path.contains_points(self.xys))[0] + self.fc[:, -1] = self.alpha_other + self.fc[self.ind, -1] = 1 + self.collection.set_facecolors(self.fc) + #self.canvas.draw_idle() + + def disconnect(self): + self.lasso.disconnect_events() + self.fc[:, -1] = 1 + self.collection.set_facecolors(self.fc) + self.canvas.draw_idle() + + +if __name__ == '__main__': + import matplotlib.pyplot as plt + + # Fixing random state for reproducibility + np.random.seed(19680801) + + data = np.random.rand(100, 2) + + subplot_kw = dict(xlim=(0, 1), ylim=(0, 1), autoscale_on=False) + fig, ax = plt.subplots(subplot_kw=subplot_kw) + + pts = ax.scatter(data[:, 0], data[:, 1], s=80) + selector = SelectFromCollection(ax, pts) + + def accept(event): + if event.key == "enter": + print("Selected points:") + print(selector.xys[selector.ind]) + selector.disconnect() + ax.set_title("") + fig.canvas.draw() + + fig.canvas.mpl_connect("key_press_event", accept) + ax.set_title("Press enter to accept selected points.") + + plt.show() + +# %% +# +# .. admonition:: References +# +# The use of the following functions, methods, classes and modules is shown +# in this example: +# +# - `matplotlib.widgets.LassoSelector` +# - `matplotlib.path.Path`