Skip to content

geom_violin fails on empty facets #147

Description

@jdanbrown

Similar to #131, but a new error:

>>> (mpg
...     .pipe(ggplot)
...     + geom_violin(aes(x='drv', y='hwy'))
...     + facet_wrap('model')
... )
Traceback (most recent call last):
  File "<ipython-input-9-f7c9f0b01077>", line 4, in <module>
    + facet_wrap('model')
  File "/Users/danb/miniconda3/envs/bubo-features/lib/python3.6/site-packages/IPython/core/displayhook.py", line 257, in __call__
    format_dict, md_dict = self.compute_format_data(result)
  File "/Users/danb/miniconda3/envs/bubo-features/lib/python3.6/site-packages/IPython/core/displayhook.py", line 151, in compute_format_data
    return self.shell.display_formatter.format(result)
  File "/Users/danb/miniconda3/envs/bubo-features/lib/python3.6/site-packages/IPython/core/formatters.py", line 180, in format
    data = formatter(obj)
  File "/Users/danb/.ipython/profile_default/ipython_config.py", line 201, in <lambda>
    IPython.core.formatters.PlainTextFormatter.__call__ = lambda self, obj: pformat(obj)  # Works, for now...
  File "/Users/danb/.ipython/profile_default/ipython_config.py", line 192, in <lambda>
    pformat = lambda x: _pp.pformat (x, width=_get_cols() or _get_cols_fallback_notebook, indent=2)
  File "/Users/danb/miniconda3/envs/bubo-features/lib/python3.6/site-packages/pprintpp/__init__.py", line 140, in pformat
    return PrettyPrinter(indent=indent, width=width, depth=depth).pformat(object)
  File "/Users/danb/miniconda3/envs/bubo-features/lib/python3.6/site-packages/pprintpp/__init__.py", line 298, in pformat
    self._format(object, state)
  File "/Users/danb/miniconda3/envs/bubo-features/lib/python3.6/site-packages/pprintpp/__init__.py", line 474, in _format
    orepr = repr(object)
  File "/Users/danb/miniconda3/envs/bubo-features/lib/python3.6/site-packages/plotnine/ggplot.py", line 95, in __repr__
    self.draw()
  File "/Users/danb/miniconda3/envs/bubo-features/lib/python3.6/site-packages/plotnine/ggplot.py", line 188, in draw
    return self._draw(return_ggplot)
  File "/Users/danb/miniconda3/envs/bubo-features/lib/python3.6/site-packages/plotnine/ggplot.py", line 195, in _draw
    self._build()
  File "/Users/danb/miniconda3/envs/bubo-features/lib/python3.6/site-packages/plotnine/ggplot.py", line 303, in _build
    layers.compute_statistic(layout)
  File "/Users/danb/miniconda3/envs/bubo-features/lib/python3.6/site-packages/plotnine/layer.py", line 87, in compute_statistic
    l.compute_statistic(layout)
  File "/Users/danb/miniconda3/envs/bubo-features/lib/python3.6/site-packages/plotnine/layer.py", line 363, in compute_statistic
    data = self.stat.compute_layer(data, params, layout)
  File "/Users/danb/miniconda3/envs/bubo-features/lib/python3.6/site-packages/plotnine/stats/stat.py", line 271, in compute_layer
    return groupby_apply(data, 'PANEL', fn)
  File "/Users/danb/miniconda3/envs/bubo-features/lib/python3.6/site-packages/plotnine/utils.py", line 632, in groupby_apply
    lst.append(func(d, *args, **kwargs))
  File "/Users/danb/miniconda3/envs/bubo-features/lib/python3.6/site-packages/plotnine/stats/stat.py", line 269, in fn
    return cls.compute_panel(pdata, pscales, **params)
  File "/Users/danb/miniconda3/envs/bubo-features/lib/python3.6/site-packages/plotnine/stats/stat_ydensity.py", line 130, in compute_panel
    data['violinwidth'] = data['density']/data['density'].max()
  File "/Users/danb/miniconda3/envs/bubo-features/lib/python3.6/site-packages/pandas/core/frame.py", line 2685, in __getitem__
    return self._getitem_column(key)
  File "/Users/danb/miniconda3/envs/bubo-features/lib/python3.6/site-packages/pandas/core/frame.py", line 2692, in _getitem_column
    return self._get_item_cache(key)
  File "/Users/danb/miniconda3/envs/bubo-features/lib/python3.6/site-packages/pandas/core/generic.py", line 2486, in _get_item_cache
    values = self._data.get(item)
  File "/Users/danb/miniconda3/envs/bubo-features/lib/python3.6/site-packages/pandas/core/internals.py", line 4115, in get
    loc = self.items.get_loc(item)
  File "/Users/danb/miniconda3/envs/bubo-features/lib/python3.6/site-packages/pandas/core/indexes/base.py", line 3065, in get_loc
    return self._engine.get_loc(self._maybe_cast_indexer(key))
  File "pandas/_libs/index.pyx", line 140, in pandas._libs.index.IndexEngine.get_loc
  File "pandas/_libs/index.pyx", line 162, in pandas._libs.index.IndexEngine.get_loc
  File "pandas/_libs/hashtable_class_helper.pxi", line 1492, in pandas._libs.hashtable.PyObjectHashTable.get_item
  File "pandas/_libs/hashtable_class_helper.pxi", line 1500, in pandas._libs.hashtable.PyObjectHashTable.get_item
KeyError: 'density'

Jumping into a debugger shows data['density'] failing on an empty data with no 'density' column:

> /Users/danb/miniconda3/envs/bubo-features/lib/python3.6/site-packages/plotnine/stats/stat_ydensity.py(130)

 125         @classmethod
 126         def compute_panel(cls, data, scales, **params):
 127             data = super(cls, cls).compute_panel(data, scales, **params)
 128
 129             if params['scale'] == 'area':
 130  ->             data['violinwidth'] = data['density']/data['density'].max()
 131             elif params['scale'] == 'count':
 132                 data['violinwidth'] = (data['density'] /
 133                                        data['density'].max() *
 134                                        data['n']/data['n'].max())
 135             elif params['scale'] == 'width':
 136                 data['violinwidth'] = data['scaled']
 137             else:
 138                 msg = "Unknown scale value '{}'"
 139                 raise PlotnineError(msg.format(params['scale']))
 140
 141             return data
ipdb> args
cls = <class 'plotnine.stats.stat_ydensity.stat_ydensity'>
data = Empty DataFrame
Columns: [PANEL, group, x]
Index: []
scales = Bunch(x=<plotnine.scales.scale_xy.scale_x_discrete object at 0x11e8fcba8>, y=<plotnine.scales.scale_xy.scale_y_continuous object at 0x11c5440b8>)
params = {'geom': <plotnine.geoms.geom_violin.geom_violin object at 0x11c9080b8>, 'position': 'dodge', 'na_rm': False, 'adjust': 1, 'kernel': 'gau', 'n': 1024, 'trim': True, 'scale': 'area', 'bw': 'normal_reference', 'gridsize': None, 'clip': (-inf, inf), 'cut': 3}

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions