-
-
Notifications
You must be signed in to change notification settings - Fork 18.5k
Sharey keyword for boxplot #20968
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
Sharey keyword for boxplot #20968
Changes from 7 commits
cb80356
8d822b0
eb71a8e
dc7f3f5
9cb994c
849105a
64aac34
8dc0e9b
6bff510
cfc0a5f
6c0c324
e0a5515
6b4d371
c1d5cab
26ef598
42d7286
7a65d8a
fd76955
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -927,6 +927,14 @@ yourself. To revert to the old setting, you can run this line: | |
|
||
pd.options.display.max_columns = 20 | ||
|
||
.. _whatsnew_0230.boxplot.sharexy: | ||
|
||
Optional sharing of x/y-axis by pandas.DataFrame().groupby().boxplot() | ||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | ||
(:issue:`15184`) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. this file needs to be reverted |
||
|
||
Optional sharing of x/y-axis by pandas.DataFrame().groupby().boxplot() | ||
|
||
.. _whatsnew_0230.api.datetimelike: | ||
|
||
Datetimelike API Changes | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -2548,7 +2548,7 @@ def plot_group(group, ax): | |
|
||
def boxplot_frame_groupby(grouped, subplots=True, column=None, fontsize=None, | ||
rot=0, grid=True, ax=None, figsize=None, | ||
layout=None, **kwds): | ||
layout=None, sharex=False, sharey=True, **kwds): | ||
""" | ||
Make box plots from DataFrameGroupBy data. | ||
|
||
|
@@ -2567,6 +2567,12 @@ def boxplot_frame_groupby(grouped, subplots=True, column=None, fontsize=None, | |
figsize : A tuple (width, height) in inches | ||
layout : tuple (optional) | ||
(rows, columns) for the layout of the plot | ||
sharex : | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Could you take a look at http://pandas.pydata.org/pandas-docs/stable/contributing_docstring.html for how to format these? Something like
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Ok, did that. Should this part of the doc-string then be corrected as well?
|
||
* ``True`` - x-axes will be shared among subplots | ||
* ``False`` - x-axes will not be shared | ||
sharey : | ||
* ``True`` - y-axes will be shared among subplots | ||
* ``False`` - y-axes will not be shared | ||
`**kwds` : Keyword Arguments | ||
All other plotting keyword arguments to be passed to | ||
matplotlib's boxplot function | ||
|
@@ -2598,7 +2604,7 @@ def boxplot_frame_groupby(grouped, subplots=True, column=None, fontsize=None, | |
if subplots is True: | ||
naxes = len(grouped) | ||
fig, axes = _subplots(naxes=naxes, squeeze=False, | ||
ax=ax, sharex=False, sharey=True, | ||
ax=ax, sharex=sharex, sharey=sharey, | ||
figsize=figsize, layout=layout) | ||
axes = _flatten(axes) | ||
|
||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -367,6 +367,64 @@ def test_subplots(self): | |
for ax in axes: | ||
assert ax.get_legend() is None | ||
|
||
def test_groupby_boxplot_sharey(self): | ||
# https://github.com/pandas-dev/pandas/issues/9737 using gridspec, | ||
# the axis in fig.get_axis() are sorted differently than pandas | ||
# expected them, so make sure that only the right ones are removed | ||
|
||
df = DataFrame({'a': [-1.43, -0.15, -3.70, -1.43, -0.14], | ||
'b': [0.56, 0.84, 0.29, 0.56, 0.85], | ||
'c': [0, 1, 2, 3, 1]}, | ||
index=[0, 1, 2, 3, 4]) | ||
|
||
# standart behavior | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. standard There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. what is 'standard' mean here, can you update the comment There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Done. |
||
axes = df.groupby('c').boxplot() | ||
self._check_visible(axes[0].get_yticklabels(), visible=True) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. These tests are a bit wordy. I wonder if the following is clear? expected = pd.Series([True, False, True, False])
result = axes.apply(lambda ax: ax.yaxis.get_visible())
tm.assert_frame_equal(result, expected) Is that the same? Do you find it clearer? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I see where you want to go. Would this be acceptable? It uses a function that you might want somewhere else though in case you want to use it in other tests? Where would be a good position to put it?
|
||
self._check_visible(axes[1].get_yticklabels(), visible=False) | ||
self._check_visible(axes[2].get_yticklabels(), visible=True) | ||
self._check_visible(axes[3].get_yticklabels(), visible=False) | ||
# set sharey=True should be identical | ||
axes = df.groupby('c').boxplot(sharey=True) | ||
self._check_visible(axes[0].get_yticklabels(), visible=True) | ||
self._check_visible(axes[1].get_yticklabels(), visible=False) | ||
self._check_visible(axes[2].get_yticklabels(), visible=True) | ||
self._check_visible(axes[3].get_yticklabels(), visible=False) | ||
# sharey=False, all yticklabels should be visible | ||
axes = df.groupby('c').boxplot(sharey=False) | ||
self._check_visible(axes[0].get_yticklabels(), visible=True) | ||
self._check_visible(axes[1].get_yticklabels(), visible=True) | ||
self._check_visible(axes[2].get_yticklabels(), visible=True) | ||
self._check_visible(axes[3].get_yticklabels(), visible=True) | ||
|
||
def test_groupby_boxplot_sharex(self): | ||
# https://github.com/pandas-dev/pandas/issues/9737 using gridspec, | ||
# the axis in fig.get_axis() are sorted differently than pandas | ||
# expected them, so make sure that only the right ones are removed | ||
|
||
df = DataFrame({'a': [-1.43, -0.15, -3.70, -1.43, -0.14], | ||
'b': [0.56, 0.84, 0.29, 0.56, 0.85], | ||
'c': [0, 1, 2, 3, 1]}, | ||
index=[0, 1, 2, 3, 4]) | ||
|
||
# standart behavior | ||
axes = df.groupby('c').boxplot() | ||
self._check_visible(axes[0].get_xticklabels(), visible=True) | ||
self._check_visible(axes[1].get_xticklabels(), visible=True) | ||
self._check_visible(axes[2].get_xticklabels(), visible=True) | ||
self._check_visible(axes[3].get_xticklabels(), visible=True) | ||
# set sharex=False should be identical | ||
axes = df.groupby('c').boxplot(sharex=False) | ||
self._check_visible(axes[0].get_xticklabels(), visible=True) | ||
self._check_visible(axes[1].get_xticklabels(), visible=True) | ||
self._check_visible(axes[2].get_xticklabels(), visible=True) | ||
self._check_visible(axes[3].get_xticklabels(), visible=True) | ||
# sharex=True, yticklabels should be visible for bottom plots | ||
axes = df.groupby('c').boxplot(sharex=True) | ||
self._check_visible(axes[0].get_xticklabels(), visible=False) | ||
self._check_visible(axes[1].get_xticklabels(), visible=False) | ||
self._check_visible(axes[2].get_xticklabels(), visible=True) | ||
self._check_visible(axes[3].get_xticklabels(), visible=True) | ||
|
||
@pytest.mark.slow | ||
def test_subplots_timeseries(self): | ||
idx = date_range(start='2014-07-01', freq='M', periods=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.
This isn't an API change, so we don't need this long of a release note. Probably a single line saying that
boxplot
now accepts thesharey
keyword, and a link to a more detailed example in the docstring or plotting.rstThere 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.
I updated the docstring and the the part in v0.23.0.txt.
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 move this to 0.23.1.txt now?
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.
And I think the example can be trimmed down. I'd rather update the docstring for
DataFrame.plot.box
since that's a longer-term thing. The release note are for people checking changes. They'll see that it now supportssharey
, and click through if interested.