Fix setting artists properties of selectors#20693
Fix setting artists properties of selectors#20693timhoffm merged 8 commits intomatplotlib:masterfrom
Conversation
|
@larsoner, does this API look good to you? |
|
Yep, and I tested it and it seems to work for us! |
|
Great, thanks @larsoner! |
d73f751 to
6a93943
Compare
|
This is ready for review |
I don't think this is a good idea. Having Should we keep them internal (and have public
That depends: How much control do we want to give to the user? |
190c96c to
9e6394f
Compare
Agreed, I have added a
I would lean toward keeping it simple for now! |
lib/matplotlib/widgets.py
Outdated
| if self._interactive: | ||
| self._setup_edge_handle(self._edge_handles._line_props) | ||
| line = self._edge_handles.artists[0] | ||
| line_props = dict(alpha=line.get_alpha(), |
There was a problem hiding this comment.
Is there a way to get the properties relevant to axvline (the kwargs of axvline)? line.properties() returns too many properties.
There was a problem hiding this comment.
Not directly. https://matplotlib.org/stable/api/_as_gen/matplotlib.axes.Axes.axvline.html#matplotlib.axes.Axes.axvline says
Valid keyword arguments are Line2D properties, with the exception of 'transform'.
That's because it's a Line2D, but we enforce the vertical placement using a transform, so this is not user-settable.
There was a problem hiding this comment.
Yes, indeed, but there are also other properties (internal properties?), which are not listed in https://matplotlib.org/stable/api/_as_gen/matplotlib.axes.Axes.axvline.html#matplotlib.axes.Axes.axvline:
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
line = ax.axvline(1.5)
props = line.properties()
del props['transform']
line.set(**props)Will give the following error:
File "/home/eric/Dev/others/matplotlib/lib/matplotlib/artist.py", line 115, in <lambda>
cls.set = lambda self, **kwargs: Artist.set(self, **kwargs)
File "/home/eric/Dev/others/matplotlib/lib/matplotlib/artist.py", line 1155, in set
return self.update(kwargs)
File "/home/eric/Dev/others/matplotlib/lib/matplotlib/artist.py", line 1060, in update
raise AttributeError(f"{type(self).__name__!r} object "
AttributeError: 'Line2D' object has no property 'children'
timhoffm
left a comment
There was a problem hiding this comment.
Essentially looks good.
Since for now, we seem to need the update, set_props() and set_handle_props() are the right way to go. In that case, do people still need access to the properties artists, selection_artist, handle_artists? If not, I'd start with keeping them private to keep the public API small. We can always make them public later if needed.
lib/matplotlib/widgets.py
Outdated
| if self._interactive: | ||
| self._setup_edge_handle(self._edge_handles._line_props) | ||
| line = self._edge_handles.artists[0] | ||
| line_props = dict(alpha=line.get_alpha(), |
There was a problem hiding this comment.
Not directly. https://matplotlib.org/stable/api/_as_gen/matplotlib.axes.Axes.axvline.html#matplotlib.axes.Axes.axvline says
Valid keyword arguments are Line2D properties, with the exception of 'transform'.
That's because it's a Line2D, but we enforce the vertical placement using a transform, so this is not user-settable.
b0545dc to
73ac533
Compare
|
This is ready for review, I have updated the description of the PR to reflect the current state. |
8f0e823 to
a871ca6
Compare
Co-authored-by: Elliott Sales de Andrade <quantum.analyst@gmail.com>
382bc1d to
cee023e
Compare
|
Thanks @QuLogic for the review, all comments should be sorted! |
Co-authored-by: Tim Hoffmann <2836374+timhoffm@users.noreply.github.com>
|
Thanks @timhoffm, all done - CI had some hiccups and I restarted it. |
|
Thanks @ericpre! |
…693-on-v3.5.x Backport PR #20693 on branch v3.5.x (Fix setting artists properties of selectors)
PR Summary
Fix #20618 by adding
set_propsandset_handle_propsmethod.This PR needs a bit of tidying up but I would like to know if we are happy with this approach!A few others changes:
selector.artistsis now a property returning a tuple of all artists to disallow changing the artists through a public API_selection_artistand_handles_artiststo access the corresponding artists internally.Remove the use ofSpanSelector._rectand other, because it is already accessible throughartists[0], maybe this is still better to keep a separate attribute?Alternative could be:
propsandhandle_propssetterget_main_artistget_handle_artists, which could use asspan.get_main_artist().set(facecolor='green'), forget_handle_artists, it would be necessary to loop over the tuplePR Checklist
pytestpasses).flake8on changed files to check).flake8-docstringsand runflake8 --docstring-convention=all).doc/users/next_whats_new/(follow instructions in README.rst there).doc/api/next_api_changes/(follow instructions in README.rst there).