Skip to content

Commit bc9e808

Browse files
TomAugspurgerTomAugspurger
authored and
TomAugspurger
committed
VIS: Hide labels for NaN/zeros in boxplt
[ci skip]
1 parent 62529cc commit bc9e808

File tree

2 files changed

+34
-1
lines changed

2 files changed

+34
-1
lines changed

pandas/tests/test_graphics.py

+23
Original file line numberDiff line numberDiff line change
@@ -628,6 +628,13 @@ def test_pie_series(self):
628628
ax = _check_plot_works(series.plot, kind='pie')
629629
self._check_text_labels(ax.texts, series.index)
630630

631+
def test_pie_nan(self):
632+
s = Series([1, np.nan, 1, 1])
633+
ax = s.plot(kind='pie', legend=True)
634+
expected = ['0', '', '2', '3']
635+
result = [x.get_text() for x in ax.texts]
636+
self.assertEqual(result, expected)
637+
631638
@slow
632639
def test_hist_df_kwargs(self):
633640
df = DataFrame(np.random.randn(10, 2))
@@ -2717,6 +2724,22 @@ def test_pie_df(self):
27172724
self._check_text_labels(ax.texts, labels)
27182725
self._check_colors(ax.patches, facecolors=color_args)
27192726

2727+
def test_pie_df_nan(self):
2728+
df = DataFrame(np.random.rand(4, 4))
2729+
for i in range(4):
2730+
df.iloc[i, i] = np.nan
2731+
fig, axes = self.plt.subplots(ncols=4)
2732+
df.plot(kind='pie', subplots=True, ax=axes, legend=True)
2733+
2734+
base_expected = ['0', '1', '2', '3']
2735+
for i, ax in enumerate(axes):
2736+
expected = list(base_expected) # copy
2737+
expected[i] = ''
2738+
result = [x.get_text() for x in ax.texts]
2739+
self.assertEqual(result, expected)
2740+
# legend labels
2741+
self.assertEqual([x.get_text() for x in ax.get_legend().get_texts()],
2742+
base_expected)
27202743
def test_errorbar_plot(self):
27212744
d = {'x': np.arange(12), 'y': np.arange(12, 0, -1)}
27222745
df = DataFrame(d)

pandas/tools/plotting.py

+11-1
Original file line numberDiff line numberDiff line change
@@ -2033,10 +2033,20 @@ def _make_plot(self):
20332033

20342034
kwds = self.kwds.copy()
20352035

2036+
def blank_labeler(label, value):
2037+
if value == 0:
2038+
return ''
2039+
else:
2040+
return label
2041+
20362042
idx = [com.pprint_thing(v) for v in self.data.index]
20372043
labels = kwds.pop('labels', idx)
20382044
# labels is used for each wedge's labels
2039-
results = ax.pie(y, labels=labels, **kwds)
2045+
# Blank out labels for values of 0 so they don't overlap
2046+
# with nonzero wedges
2047+
blabels = [blank_labeler(label, value) for
2048+
label, value in zip(labels, y)]
2049+
results = ax.pie(y, labels=blabels, **kwds)
20402050

20412051
if kwds.get('autopct', None) is not None:
20422052
patches, texts, autotexts = results

0 commit comments

Comments
 (0)