Skip to content

Commit 9c92636

Browse files
committed
Merge pull request #7225 from sinhrks/boxbug
BUG: boxplot returns incorrect dict
2 parents 7443bb7 + 7ea4583 commit 9c92636

File tree

2 files changed

+53
-6
lines changed

2 files changed

+53
-6
lines changed

pandas/tests/test_graphics.py

+44-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@
1010
from datetime import datetime, date
1111

1212
from pandas import Series, DataFrame, MultiIndex, PeriodIndex, date_range
13-
from pandas.compat import range, lrange, StringIO, lmap, lzip, u, zip
13+
from pandas.compat import (range, lrange, StringIO, lmap, lzip, u, zip,
14+
iteritems, OrderedDict)
1415
from pandas.util.decorators import cache_readonly
1516
import pandas.core.common as com
1617
import pandas.util.testing as tm
@@ -2245,6 +2246,48 @@ def test_grouped_hist(self):
22452246
with tm.assertRaises(AttributeError):
22462247
plotting.grouped_hist(df.A, by=df.C, foo='bar')
22472248

2249+
def _check_box_dict(self, returned, return_type,
2250+
expected_klass, expected_keys):
2251+
self.assertTrue(isinstance(returned, OrderedDict))
2252+
self.assertEqual(sorted(returned.keys()), sorted(expected_keys))
2253+
for key, value in iteritems(returned):
2254+
self.assertTrue(isinstance(value, expected_klass))
2255+
# check returned dict has correct mapping
2256+
if return_type == 'axes':
2257+
self.assertEqual(value.get_title(), key)
2258+
elif return_type == 'both':
2259+
self.assertEqual(value.ax.get_title(), key)
2260+
elif return_type == 'dict':
2261+
line = value['medians'][0]
2262+
self.assertEqual(line.get_axes().get_title(), key)
2263+
else:
2264+
raise AssertionError
2265+
2266+
@slow
2267+
def test_grouped_box_return_type(self):
2268+
import matplotlib.axes
2269+
2270+
df = self.hist_df
2271+
2272+
columns2 = 'X B C D A G Y N Q O'.split()
2273+
df2 = DataFrame(random.randn(50, 10), columns=columns2)
2274+
categories2 = 'A B C D E F G H I J'.split()
2275+
df2['category'] = tm.choice(categories2, size=50)
2276+
2277+
types = {'dict': dict, 'axes': matplotlib.axes.Axes, 'both': tuple}
2278+
for t, klass in iteritems(types):
2279+
returned = df.groupby('classroom').boxplot(return_type=t)
2280+
self._check_box_dict(returned, t, klass, ['A', 'B', 'C'])
2281+
2282+
returned = df.boxplot(by='classroom', return_type=t)
2283+
self._check_box_dict(returned, t, klass, ['height', 'weight', 'category'])
2284+
2285+
returned = df2.groupby('category').boxplot(return_type=t)
2286+
self._check_box_dict(returned, t, klass, categories2)
2287+
2288+
returned = df2.boxplot(by='category', return_type=t)
2289+
self._check_box_dict(returned, t, klass, columns2)
2290+
22482291
@slow
22492292
def test_grouped_box_layout(self):
22502293
df = self.hist_df

pandas/tools/plotting.py

+9-5
Original file line numberDiff line numberDiff line change
@@ -2363,12 +2363,17 @@ def plot_group(grouped, ax):
23632363
if return_type is None:
23642364
ret = axes
23652365
if return_type == 'axes':
2366-
ret = dict((k, ax) for k, ax in zip(d.keys(), axes))
2366+
ret = compat.OrderedDict()
2367+
axes = _flatten(axes)[:len(d)]
2368+
for k, ax in zip(d.keys(), axes):
2369+
ret[k] = ax
23672370
elif return_type == 'dict':
23682371
ret = d
23692372
elif return_type == 'both':
2370-
ret = dict((k, BP(ax=ax, lines=line)) for
2371-
(k, line), ax in zip(d.items(), axes))
2373+
ret = compat.OrderedDict()
2374+
axes = _flatten(axes)[:len(d)]
2375+
for (k, line), ax in zip(d.items(), axes):
2376+
ret[k] = BP(ax=ax, lines=line)
23722377
else:
23732378
if layout is not None:
23742379
raise ValueError("The 'layout' keyword is not supported when "
@@ -2723,7 +2728,7 @@ def boxplot_frame_groupby(grouped, subplots=True, column=None, fontsize=None,
27232728
sharex=False, sharey=True)
27242729
axes = _flatten(axes)
27252730

2726-
ret = {}
2731+
ret = compat.OrderedDict()
27272732
for (key, group), ax in zip(grouped, axes):
27282733
d = group.boxplot(ax=ax, column=column, fontsize=fontsize,
27292734
rot=rot, grid=grid, **kwds)
@@ -2804,7 +2809,6 @@ def _grouped_plot_by_column(plotf, data, columns=None, by=None,
28042809
ravel_axes = _flatten(axes)
28052810

28062811
out_dict = compat.OrderedDict()
2807-
28082812
for i, col in enumerate(columns):
28092813
ax = ravel_axes[i]
28102814
gp_col = grouped[col]

0 commit comments

Comments
 (0)