Skip to content

geom_violin fails on empty groups #131

Description

@jdanbrown

Error in geom_violin:

(mpg
    .pipe(ggplot, aes(x='class', y='hwy'))
    + facet_grid('drv ~ .')
    + geom_violin()
)
/Users/danb/miniconda3/envs/test/lib/python3.6/site-packages/statsmodels/nonparametric/kde.py:494: RuntimeWarning: invalid value encountered in true_divide
  binned = fast_linbin(X,a,b,gridsize)/(delta*nobs)
/Users/danb/miniconda3/envs/test/lib/python3.6/site-packages/statsmodels/nonparametric/kdetools.py:34: RuntimeWarning: invalid value encountered in double_scalars
  FAC1 = 2*(np.pi*bw/RANGE)**2
/Users/danb/miniconda3/envs/test/lib/python3.6/site-packages/statsmodels/sandbox/nonparametric/kernels.py:204: RuntimeWarning: divide by zero encountered in double_scalars
  w = 1. / (h * n) * np.sum(self((xs-x)/h), axis=0)
/Users/danb/miniconda3/envs/test/lib/python3.6/site-packages/statsmodels/sandbox/nonparametric/kernels.py:204: RuntimeWarning: invalid value encountered in true_divide
  w = 1. / (h * n) * np.sum(self((xs-x)/h), axis=0)
Traceback (most recent call last):
  File "/Users/danb/miniconda3/envs/test/lib/python3.6/site-packages/IPython/core/formatters.py", line 702, in __call__
    printer.pretty(obj)
  File "/Users/danb/miniconda3/envs/test/lib/python3.6/site-packages/IPython/lib/pretty.py", line 395, in pretty
    return _default_pprint(obj, self, cycle)
  File "/Users/danb/.ipython/profile_default/ipython_config.py", line 195, in <lambda>
    p.text(pformat(obj))
  File "/Users/danb/.ipython/profile_default/ipython_config.py", line 187, in <lambda>
    pformat = lambda x: _pp.pformat (x, width=_get_cols() or _get_cols_fallback_notebook, indent=2)
  File "/Users/danb/miniconda3/envs/test/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/test/lib/python3.6/site-packages/pprintpp/__init__.py", line 298, in pformat
    self._format(object, state)
  File "/Users/danb/miniconda3/envs/test/lib/python3.6/site-packages/pprintpp/__init__.py", line 474, in _format
    orepr = repr(object)
  File "/Users/danb/miniconda3/envs/test/lib/python3.6/site-packages/plotnine/ggplot.py", line 95, in __repr__
    self.draw()
  File "/Users/danb/miniconda3/envs/test/lib/python3.6/site-packages/plotnine/ggplot.py", line 188, in draw
    return self._draw(return_ggplot)
  File "/Users/danb/miniconda3/envs/test/lib/python3.6/site-packages/plotnine/ggplot.py", line 195, in _draw
    self._build()
  File "/Users/danb/miniconda3/envs/test/lib/python3.6/site-packages/plotnine/ggplot.py", line 303, in _build
    layers.compute_statistic(layout)
  File "/Users/danb/miniconda3/envs/test/lib/python3.6/site-packages/plotnine/layer.py", line 87, in compute_statistic
    l.compute_statistic(layout)
  File "/Users/danb/miniconda3/envs/test/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/test/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/test/lib/python3.6/site-packages/plotnine/utils.py", line 630, in groupby_apply
    lst.append(func(d, *args, **kwargs))
  File "/Users/danb/miniconda3/envs/test/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/test/lib/python3.6/site-packages/plotnine/stats/stat_ydensity.py", line 127, in compute_panel
    data = super(cls, cls).compute_panel(data, scales, **params)
  File "/Users/danb/miniconda3/envs/test/lib/python3.6/site-packages/plotnine/stats/stat.py", line 302, in compute_panel
    new = cls.compute_group(old, scales, **params)
  File "/Users/danb/miniconda3/envs/test/lib/python3.6/site-packages/plotnine/stats/stat_ydensity.py", line 157, in compute_group
    dens = compute_density(data['y'], weight, range_y, **params)
  File "/Users/danb/miniconda3/envs/test/lib/python3.6/site-packages/plotnine/stats/stat_density.py", line 202, in compute_density
    'scaled': y / np.max(y),
  File "/Users/danb/miniconda3/envs/test/lib/python3.6/site-packages/numpy/core/fromnumeric.py", line 2320, in amax
    out=out, **kwargs)
  File "/Users/danb/miniconda3/envs/test/lib/python3.6/site-packages/numpy/core/_methods.py", line 26, in _amax
    return umr_maximum(a, axis, None, out, keepdims)
ValueError: zero-size array to reduction operation maximum which has no identity

Works fine with geom_point:

(mpg
    .pipe(ggplot, aes(x='class', y='hwy'))
    + facet_grid('drv ~ .')
    + geom_point()
)

mpg-n-pipe-ggplo-03fd9e5a

My guess is that geom_violin / stat_ydensity is failing on the empty groups?

Versions

$ pip freeze | egrep 'plotnine|numpy'
numpy==1.14.0
plotnine==0.3.0+52.g71a21ad

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