close
Skip to content

geom_violin fails on empty groups #131

@jdanbrown

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions