From b89befe1eb9f15f0cc76947d3f63c1c2ce0d19f6 Mon Sep 17 00:00:00 2001 From: Hassan Kibirige Date: Thu, 29 Jun 2017 01:13:46 -0500 Subject: [PATCH] Fix data ordering in panels when facetting The bug appeared when facetting but there could be other cases where it would show up. The real bug is in pandas, how it sorts a dataframe by a categorical column. fixes #26 --- doc/changelog.rst | 6 +++++- plotnine/facets/facet_grid.py | 4 +++- plotnine/facets/facet_wrap.py | 3 ++- .../test_geom_ribbon_area/ribbon_facetting.png | Bin 0 -> 21548 bytes plotnine/tests/test_geom_ribbon_area.py | 12 +++++++++++- 5 files changed, 21 insertions(+), 4 deletions(-) create mode 100644 plotnine/tests/baseline_images/test_geom_ribbon_area/ribbon_facetting.png diff --git a/doc/changelog.rst b/doc/changelog.rst index 3fa055f1e..f3a52f1de 100644 --- a/doc/changelog.rst +++ b/doc/changelog.rst @@ -12,6 +12,10 @@ v0.2.2 is only set to the value ``'direct'`` if predictions will be made outside the data range. +- Fixed bug where facetting led to a reordering of the data. This + would manifest as a bug for ``geoms`` where order was important. + (:issue:`26`) + v0.2.1 ------ *(2017-06-22)* @@ -33,7 +37,7 @@ v0.2.1 the panels. - Fixed bug in :class:`~plotnine.stat_density` where changing the - x limits lead to an exception (:issue: `22`) + x limits lead to an exception (:issue:`22`) v0.2.0 diff --git a/plotnine/facets/facet_grid.py b/plotnine/facets/facet_grid.py index 403d155eb..e5ed55a3e 100644 --- a/plotnine/facets/facet_grid.py +++ b/plotnine/facets/facet_grid.py @@ -142,6 +142,8 @@ def map(self, data, layout): keys = join_keys(facet_vals, layout, vars) data['PANEL'] = match(keys['x'], keys['y'], start=1) + data = data.sort_values('PANEL', kind='mergesort') + # matching dtype and # the categories(panel numbers) for the data should be in the # same order as the panels. i.e the panels are the reference, @@ -150,7 +152,7 @@ def map(self, data, layout): data['PANEL'], categories=layout['PANEL'].cat.categories, ordered=True) - data = data.sort_values('PANEL') + data.reset_index(drop=True, inplace=True) return data diff --git a/plotnine/facets/facet_wrap.py b/plotnine/facets/facet_wrap.py index c2ba828f7..4f3821aa0 100644 --- a/plotnine/facets/facet_wrap.py +++ b/plotnine/facets/facet_wrap.py @@ -137,13 +137,14 @@ def map(self, data, layout): # assign each point to a panel keys = join_keys(facet_vals, layout, self.vars) data['PANEL'] = match(keys['x'], keys['y'], start=1) + data = data.sort_values('PANEL', kind='mergesort') # matching dtype data['PANEL'] = pd.Categorical( data['PANEL'], categories=layout['PANEL'].cat.categories, ordered=True) - data = data.sort_values('PANEL') + data.reset_index(drop=True, inplace=True) return data diff --git a/plotnine/tests/baseline_images/test_geom_ribbon_area/ribbon_facetting.png b/plotnine/tests/baseline_images/test_geom_ribbon_area/ribbon_facetting.png new file mode 100644 index 0000000000000000000000000000000000000000..680be97de2a2bbc761a17b602996fcd497615b20 GIT binary patch literal 21548 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 literal 0 HcmV?d00001 diff --git a/plotnine/tests/test_geom_ribbon_area.py b/plotnine/tests/test_geom_ribbon_area.py index f53e06618..e52ed0ac3 100644 --- a/plotnine/tests/test_geom_ribbon_area.py +++ b/plotnine/tests/test_geom_ribbon_area.py @@ -4,7 +4,7 @@ import pandas as pd from plotnine import (ggplot, aes, geom_area, geom_ribbon, - scale_x_continuous, theme) + facet_wrap, scale_x_continuous, theme) n = 4 # No. of ribbions in a vertical stack m = 100 # Points @@ -57,3 +57,13 @@ def test_area_aesthetics(): ) assert p + _theme == 'area_aesthetics' + + +def test_ribbon_facetting(): + p = (ggplot(df, aes('x', ymin='ymin', ymax='ymax', + fill='factor(z)')) + + geom_ribbon() + + facet_wrap('~ z') + ) + + assert p + _theme == 'ribbon_facetting'