From 5372263835a285c51bd0b58f0687475c8ebde4dd Mon Sep 17 00:00:00 2001 From: m-guberina <gubi.guberina@gmail.com> Date: Tue, 7 Nov 2023 14:03:53 +0100 Subject: [PATCH] put example back, wrote note that it might be better to turn the path into a collection of bezier curves or something to make em nice and smooth --- drawing_gen/.draw_path.py.swp | Bin 12288 -> 0 bytes drawing_gen/.example_draw.py.swp | Bin 12288 -> 0 bytes drawing_gen/draw_path.py | 8 +- drawing_gen/lasso_selector_demo_sgskip.py | 113 ++++++++++++++++++++++ 4 files changed, 120 insertions(+), 1 deletion(-) delete mode 100644 drawing_gen/.draw_path.py.swp delete mode 100644 drawing_gen/.example_draw.py.swp create mode 100644 drawing_gen/lasso_selector_demo_sgskip.py diff --git a/drawing_gen/.draw_path.py.swp b/drawing_gen/.draw_path.py.swp deleted file mode 100644 index 26bbfd9be5319d2a72f37da9da24071c9bd03b1f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12288 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 diff --git a/drawing_gen/.example_draw.py.swp b/drawing_gen/.example_draw.py.swp deleted file mode 100644 index 9b10bb278d92b8826460e0aae659d6cd2025bd69..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12288 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 NXf)*)q054T5CB(5o}~Z) diff --git a/drawing_gen/draw_path.py b/drawing_gen/draw_path.py index 5e9e22c..c8e3aa5 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 0000000..f5a206f --- /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` -- GitLab