-
-
Notifications
You must be signed in to change notification settings - Fork 7.9k
Horizontal radio buttons #13374
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Horizontal radio buttons #13374
Conversation
flake8 needs to pass 😉 https://travis-ci.org/matplotlib/matplotlib/jobs/489577517 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks for the PR @mromanie !
Here are a couple of comments. I'll do a more thorough review once these are addressed.
Can you in addition add a what's new entry? See doc/users/next_whats_new/README.rst
lib/matplotlib/widgets.py
Outdated
""" | ||
if orientation not in ['vertical', 'horizontal']: | ||
raise ValueError("Invalid RadioButton orientation: %s" % orientation) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Can you add what are the possible values here?
Can you also add a mock test to make sure it runs, as well as a test to make sure this exception is raised properly.
I also think we need to update the examples to show case this (examples/widgets/radio_buttons.py)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
We have a shortcut function to check options like this and raise an appropriate error now, cbook._check_in_list
lib/matplotlib/widgets.py
Outdated
@@ -1007,7 +1007,12 @@ def __init__(self, ax, labels, active=0, activecolor='blue'): | |||
The index of the initially selected button. | |||
activecolor : color | |||
The color of the selected button. | |||
orientation : str | |||
The orientation of the buttons: 'vertical' (default), or 'horizontal'. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The keyword being a bit confusing here, I think it's worth detailing a bit more what orientation means (which is the set of radio buttons are on the same horizontal axis or vertical axis).
For the failing flake8 test, I would suggest adding the check directly to your text editor. |
Milestoning 3.2 as there has not been activity recently. @mromanie are you still interested to work on this? |
@timhoffm Apologies for my inactivity. I am indeed still very much interested in working on this. In fact, I think I managed to do it properly by using patches.Ellipse instead of patches.Circle and stretching them to look circular using the aspects of the axes and figure. In this way, the entire surface of the buttons is sensitive, unlike the current implementation with patches.Circle. I still need to clean up the auto-scaling of the size of the symbols, which at the moment still results in the symbols to overlap under certain circumstances, and I'll submit the whole lot for review. Shall I use the same PR for this? |
What about using a |
@ImportanceOfBeingErnest I'm not familiar with
Plus a couple more things to make it backwards compatible. Like I said earlier, setting circle_radius to a fixed value is not always satisfactory and I' fine-tuning it. |
...forgot to say, the condition to activate the Ellipse button is:
|
If you plot a |
OK, thanks! All things considered, I would stick to the solution with Ellipse because:
|
Not sure what the status is here. Since someone asked a question about horizontal buttons on stackoverflow, I thought it might be worth showing a solution over there: https://stackoverflow.com/questions/55095111/displaying-radio-buttons-horizontally-in-matplotlib/55102639#55102639 Of course this could also be used for this update. |
This looks mostly done, but needs a rebase and a small tweak to the checks. The squashing is something that affects vertical buttons too, so could be a separate PR. |
d6c2cbe
to
8ea3641
Compare
Selecting by closest button is now merged as #13268. Using a scatter plot to ensure circular buttons is merged as #24474. I pushed a rebase, dropping the old changes, fixed the review comments and adding a test/what's new entry. I also modified the implementation a bit so that it modifies the placement of the buttons instead of reversing the I'm also working on implementing the same change for |
8ea3641
to
035517e
Compare
An example of how this looks may be found in the what's new entry: https://output.circle-artifacts.com/output/job/26b48f05-0be7-417a-b57e-305a60aa66b9/artifacts/0/doc/build/html/users/next_whats_new/widget_horizontal.html |
035517e
to
f76df0a
Compare
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
|
||
The `.RadioButtons` widget's primary layout direction may now be specified with | ||
the *orientation* keyword argument: |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Is orientation the right name? I know we use it in some places, but more in the sense of rotation than arrangement.
Possible alternatives: arrangement, direction, layout, ...
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
We use orientation for direction of grouped things in boxplot (and internally in bars)
https://matplotlib.org/devdocs/users/next_whats_new/boxplot_orientation.html
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Boxplot is a counter example. There (as well as bar) it's associated with the rotation of the box = direction of the whiskers. "Vertical" means the distribution is along the y axis and multiple boxes are arranged side-by-side horizontally.
In contrast, here "vertical" would mean multiple radio buttons are arranged stacked vertically.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yeah, I'd say "pack_direction" or "layout_direction". This isn't going to be a heavily used kwarg, so we can be verbose.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
"layout_direction" sounds good.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
With respect to #27946 (comment), is that something we want to use orientation
for (giving that this change would be moving toward layout_direction
)?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Do you mean text above or to the side of the button? I would not make this configurable but always put the text to the side. This is marginally more work, but the standard look and feel of radio buttons. If we want to add the horizontal layout, IMHO we have to do it properly.
A new optional keyword argument 'layout_direction' is introduced to control it. The new parameter defaults to 'vertical' for backwards compatibility.
f76df0a
to
b82537a
Compare
Are you guys still working on this? Its been 5 years for what seems like a trivial (but very useful) feature |
I'm using this patch locally and it has been working fine for me for a while now. |
Yeah, sorry: I originated this and then overlooked to complete it. Anything I should do now? Thanks!
Ciao,
Martino
--
Due to my own family/work balance, you may receive emails from me outside of normal working hours. I do not expect a response from you outside of your own working pattern, nor do I expect an immediate response when you are working.
From: Doron Behar ***@***.***>
Reply to: matplotlib/matplotlib ***@***.***>
Date: Wednesday, 12. March 2025 at 08:56
To: matplotlib/matplotlib ***@***.***>
Cc: Martino Romaniello ***@***.***>, Mention ***@***.***>
Subject: Re: [matplotlib/matplotlib] Horizontal radio buttons (#13374)
This email was sent from outside of ESO from the address ***@***.***. If it looks suspicious, please report it to ***@***.***
I'm using this patch locally and it has been working fine for me for a while now.
—
Reply to this email directly, view it on GitHub<#13374 (comment)>, or unsubscribe<https://github.com/notifications/unsubscribe-auth/AE5K2YYOOHOR4BRYUT6QMVD2T7R7RAVCNFSM6AAAAABY2HAI2KVHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHMZDOMJWHE3DCNBXGI>.
You are receiving this because you were mentioned.Message ID: ***@***.***>
[Image removed by sender. doronbehar]doronbehar left a comment (matplotlib/matplotlib#13374)<#13374 (comment)>
I'm using this patch locally and it has been working fine for me for a while now.
—
Reply to this email directly, view it on GitHub<#13374 (comment)>, or unsubscribe<https://github.com/notifications/unsubscribe-auth/AE5K2YYOOHOR4BRYUT6QMVD2T7R7RAVCNFSM6AAAAABY2HAI2KVHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHMZDOMJWHE3DCNBXGI>.
You are receiving this because you were mentioned.Message ID: ***@***.***>
|
@@ -1593,9 +1594,16 @@ def __init__(self, ax, labels, active=0, activecolor=None, *, | |||
button. | |||
|
|||
.. versionadded:: 3.7 | |||
layout_direction : {'vertical', 'horizontal'} | |||
The orientation of the buttons: 'vertical' places buttons from top | |||
to bottom, 'horizontal' places buttons from left to right. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
to bottom, 'horizontal' places buttons from left to right. | |
to bottom, 'horizontal' places buttons from left to right, distributing | |
the buttons across the whole Axes. The Axes is divided into equal-sized | |
boxes, and each button is left-aligned in the box. There is currently no | |
size check with the associated labels, so that long labels may overlap | |
with the next box. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Sorry, I did not check what this actually does:
I strongly think we should follow standard conventions that labels are right of the button not above, because I consider the unusual layout a UX issue. See also #27946 (comment).
The orientation of the buttons: 'vertical' places buttons from top | ||
to bottom, 'horizontal' places buttons from left to right. | ||
|
||
.. versionadded:: 3.10 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
.. versionadded:: 3.10 | |
.. versionadded:: 3.11 |
PR Summary
Add the option to have horizontal RadioButtons. A new optional keyword argument 'direction' is introduced to control it. The new parameter defaults to 'vertical' for backwards compatibility.
PR Checklist