streamz icon indicating copy to clipboard operation
streamz copied to clipboard

Holoviews plotting issues

Open mrocklin opened this issue 7 years ago • 0 comments

Given this setup

import pandas as pd
from streamz.dataframe import DataFrame, Random
import streamz.dataframe.holoviews

df = pd.DataFrame({'x': [1, 2, 3], 'y': [4.5, 5, 6.5]},
                  pd.DatetimeIndex([1, 2, 3]))
sdf = DataFrame(example=df)

This fails because Series.plot doesn't support bar.

sdf.groupby('x').y.mean().plot.bar()
AttributeError                            Traceback (most recent call last)
<ipython-input-11-1265e5d0fb4f> in <module>()
----> 1 sdf.groupby('x').y.mean().plot.bar()

/home/mrocklin/workspace/streamz/streamz/dataframe/holoviews.py in bar(self, **kwds)
    298         axes : matplotlib.AxesSubplot or np.array of them
    299         """
--> 300         return self(kind='bar', **kwds)
    301 
    302     def barh(self, **kwds):

/home/mrocklin/workspace/streamz/streamz/dataframe/holoviews.py in __call__(self, kind, width, height, backlog, use_index, title, grid, legend, logx, logy, loglog, xticks, yticks, xlim, ylim, rot, fontsize, colormap, table, yerr, xerr, **kwds)
    256             xticks=xticks, yticks=yticks, xlim=xlim, ylim=ylim, rot=rot,
    257             fontsize=fontsize, colormap=colormap, yerr=yerr, xerr=xerr, **kwds)
--> 258         return converter(kind)
    259 
    260     def line(self, **kwds):

/home/mrocklin/workspace/streamz/streamz/dataframe/holoviews.py in __call__(self, kind)
    177 
    178     def __call__(self, kind):
--> 179         return getattr(self, kind)()
    180 
    181     def chart(self, chart):

AttributeError: 'HoloViewsSeriesConverter' object has no attribute 'bar'

When we do the same thing with a dataframe we get a different error:

sdf.groupby('x').mean().plot.bar()
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
/home/mrocklin/Software/anaconda/lib/python3.6/site-packages/IPython/core/formatters.py in __call__(self, obj)
    305                 pass
    306             else:
--> 307                 return printer(obj)
    308             # Finally look for special method names
    309             method = get_real_method(obj, self.print_method)

/home/mrocklin/workspace/holoviews/holoviews/ipython/display_hooks.py in pprint_display(obj)
    257     if not ip.display_formatter.formatters['text/plain'].pprint:
    258         return None
--> 259     return display(obj, raw=True)
    260 
    261 

/home/mrocklin/workspace/holoviews/holoviews/ipython/display_hooks.py in display(obj, raw, **kwargs)
    243     elif isinstance(obj, (HoloMap, DynamicMap)):
    244         with option_state(obj):
--> 245             html = map_display(obj)
    246     else:
    247         return repr(obj) if raw else IPython.display.display(obj, **kwargs)

/home/mrocklin/workspace/holoviews/holoviews/ipython/display_hooks.py in wrapped(element)
    130         try:
    131             html = fn(element,
--> 132                       max_frames=OutputSettings.options['max_frames'])
    133 
    134             # Only want to add to the archive for one display hook...

/home/mrocklin/workspace/holoviews/holoviews/ipython/display_hooks.py in map_display(vmap, max_frames)
    198         return None
    199 
--> 200     return render(vmap)
    201 
    202 

/home/mrocklin/workspace/holoviews/holoviews/ipython/display_hooks.py in render(obj, **kwargs)
     60     if renderer.fig == 'pdf':
     61         renderer = renderer.instance(fig='png')
---> 62     return renderer.html(obj, **kwargs)
     63 
     64 

/home/mrocklin/workspace/holoviews/holoviews/plotting/renderer.py in html(self, obj, fmt, css, comm, **kwargs)
    256         code to initialize a Comm, if the plot supplies one.
    257         """
--> 258         plot, fmt =  self._validate(obj, fmt)
    259         figdata, _ = self(plot, fmt, **kwargs)
    260         if css is None: css = self.css

/home/mrocklin/workspace/holoviews/holoviews/plotting/renderer.py in _validate(self, obj, fmt)
    192         if isinstance(obj, tuple(self.widgets.values())):
    193             return obj, 'html'
--> 194         plot = self.get_plot(obj, renderer=self)
    195 
    196         fig_formats = self.mode_formats['fig'][self.mode]

/home/mrocklin/workspace/holoviews/holoviews/plotting/bokeh/renderer.py in get_plot(self_or_cls, obj, doc, renderer)
    115         combining the bokeh model with another plot.
    116         """
--> 117         plot = super(BokehRenderer, self_or_cls).get_plot(obj, renderer)
    118         if self_or_cls.mode == 'server' and doc is None:
    119             doc = curdoc()

/home/mrocklin/workspace/holoviews/holoviews/plotting/renderer.py in get_plot(self_or_cls, obj, renderer)
    164         """
    165         # Initialize DynamicMaps with first data item
--> 166         initialize_dynamic(obj)
    167         backend = self_or_cls.backend
    168 

/home/mrocklin/workspace/holoviews/holoviews/plotting/util.py in initialize_dynamic(obj)
    179             continue
    180         if not len(dmap):
--> 181             dmap[dmap._initial_key()]
    182 
    183 

/home/mrocklin/workspace/holoviews/holoviews/core/spaces.py in __getitem__(self, key)
   1024         # Not a cross product and nothing cached so compute element.
   1025         if cache is not None: return cache
-> 1026         val = self._execute_callback(*tuple_key)
   1027         if data_slice:
   1028             val = self._dataslice(val, data_slice)

/home/mrocklin/workspace/holoviews/holoviews/core/spaces.py in _execute_callback(self, *args)
    840         kdims = [kdim.name for kdim in self.kdims]
    841         kwarg_items = [s.contents.items() for s in self.streams]
--> 842         hash_items = tuple(tuple(sorted(s.hashkey.items())) for s in self.streams)+args
    843         flattened = [(k,v) for kws in kwarg_items for (k,v) in kws
    844                      if k not in kdims]

/home/mrocklin/workspace/holoviews/holoviews/core/spaces.py in <genexpr>(.0)
    840         kdims = [kdim.name for kdim in self.kdims]
    841         kwarg_items = [s.contents.items() for s in self.streams]
--> 842         hash_items = tuple(tuple(sorted(s.hashkey.items())) for s in self.streams)+args
    843         flattened = [(k,v) for kws in kwarg_items for (k,v) in kws
    844                      if k not in kdims]

/home/mrocklin/workspace/holoviews/holoviews/streams.py in hashkey(self)
    388     @property
    389     def hashkey(self):
--> 390         if self._memoize:
    391             return self.contents
    392         return {'hash': uuid.uuid4().hex}

/home/mrocklin/Software/anaconda/lib/python3.6/site-packages/pandas/core/generic.py in __nonzero__(self)
   1119         raise ValueError("The truth value of a {0} is ambiguous. "
   1120                          "Use a.empty, a.bool(), a.item(), a.any() or a.all()."
-> 1121                          .format(self.__class__.__name__))
   1122 
   1123     __bool__ = __nonzero__

ValueError: The truth value of a DataFrame is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

Out[15]:
:DynamicMap   []
In [12]:

I'm on my plot-holoviews branch. cc @philippjfr

mrocklin avatar Nov 24 '17 17:11 mrocklin