Skip to content

geom_violin fails on empty facets #147

Closed
@jdanbrown

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}

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions