Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Bokeh heatmap usage

I have an array of certain events with time stamp and want to create a heatmap:

  • x axis should represent the date, f.e. '2016-02-03',
  • y axis should represent the hour of occurrence, f.e. 13 (if 13:32),
  • the color should depend on the count of occurred event.

My data (as pandas dataframe z.head()):

         date hour  i
0  2016-01-15   13  1
1  2016-01-15   13  1
2  2016-01-15   12  1
3  2016-01-15   10  1
4  2016-01-15   10  1

My failed attempt:

from bokeh._legacy_charts import HeatMap, output_file, show
hm = HeatMap(z.head(), x='date', y='hour', values='i', stat='count')

And the exception:

AttributeError                            Traceback (most recent call last)
<ipython-input-98-83c7e9319496> in <module>()
----> 1 hm = HeatMap(z.head(), x='date', y='hour', values='i', stat='count')

/home/user/.local/lib/python3.4/site-packages/bokeh/charts/builders/heatmap_builder.py in HeatMap(data, x, y, values, stat, xgrid, ygrid, hover_tool, hover_text, **kw)
     90     kw['values'] = values
     91     kw['stat'] = stat
---> 92     chart = create_and_build(HeatMapBuilder, data, xgrid=xgrid, ygrid=ygrid, **kw)
     93 
     94     if hover_tool:

/home/user/.local/lib/python3.4/site-packages/bokeh/charts/builder.py in create_and_build(builder_class, *data, **kws)
     65     chart_kws = { k:v for k,v in kws.items() if k not in builder_props}
     66     chart = Chart(**chart_kws)
---> 67     chart.add_builder(builder)
     68     chart.start_plot()
     69 

/home/user/.local/lib/python3.4/site-packages/bokeh/charts/chart.py in add_builder(self, builder)
    150     def add_builder(self, builder):
    151         self._builders.append(builder)
--> 152         builder.create(self)
    153 
    154     def add_ranges(self, dim, range):

/home/user/.local/lib/python3.4/site-packages/bokeh/charts/builder.
    510         # call methods that allow customized setup by subc
    511         self.setup()
--> 512         self.process_data()
    513 
    514         # create and add renderers to chart

/home/user/.local/lib/python3.4/site-packages/bokeh/charts/builders
    169         # color by the values selection
    170         self.attributes['color'].setup(data=self._data.sou
--> 171                                        columns=self.values
    172         self.attributes['color'].add_bin_labels(self._data
    173 

/home/user/.local/lib/python3.4/site-packages/bokeh/charts/attribut
    187 
    188         if self.columns is not None and self.data is not N
--> 189             self.attr_map = self._create_attr_map(self.dat
    190 
    191     def update_data(self, data):

/home/user/.local/lib/python3.4/site-packages/bokeh/charts/attribut
    158         """Creates map between unique values and available
    159 
--> 160         self._generate_items(df, columns)
    161         iterable = self._setup_iterable()
    162 

/home/user/.local/lib/python3.4/site-packages/bokeh/charts/attribut
    230 
    231                 self.bins = Bins(source=ColumnDataSource(d
--> 232                                  bin_count=len(self.iterab
    233 
    234                 if self.sort:

/home/user/.local/lib/python3.4/site-packages/bokeh/charts/stats.py
    309         properties['source'] = source
    310 
--> 311         super(Bins, self).__init__(**properties)
    312 
    313     def _get_stat(self):

/home/user/.local/lib/python3.4/site-packages/bokeh/charts/stats.py
     54 
     55         super(Stat, self).__init__(**properties)
---> 56         self._refresh()
     57 
     58     def _refresh(self):

/home/user/.local/lib/python3.4/site-packages/bokeh/charts/stats.py
     60         if self.get_data() is not None:
     61             self.update()
---> 62             self.calculate()
     63 
     64     def set_data(self, data, column=None):

/home/user/.local/lib/python3.4/site-packages/bokeh/charts/stats.py
    342         if self.source is not None:
    343             # add bin column to data source
--> 344             self.source.add(binned.tolist(), name=self.bin
    345             df = self.source.to_df()
    346         else:

AttributeError: 'Categorical' object has no attribute 'tolist'

Bokeh is in the version 0.11, installed with pip3. What am I doing wrong? Thank you.

UPDATED:

  • My bad on the legacy_charts (copied wrong line).
  • I have reinstalled bokeh pip3 install --user --force-reinstall --upgrade bokeh. Still no joy.

The whole code:

import pandas as pd
from bokeh.charts import HeatMap, output_file, show

z = pd.DataFrame()
z['date'] = ['2016-01-15', '2016-01-13', '2016-01-11', '2016-01-14', '2016-01-15']
z['hour'] = [12, 10, 11, 3, 0]
z['i'] = [1, 1, 1, 1, 1]

output_file('/tmp/test.html')
hm = HeatMap(z, x='date', y='hour', stat='count')
show(hm)

And running using python3:

Traceback (most recent call last):
  File "so.py", line 10, in <module>
    hm = HeatMap(z, x='date', y='hour', stat='count')
  File "/home/ktx/.local/lib/python3.4/site-packages/bokeh/charts/builders/heatmap_builder.py", line 92, in HeatMap
    chart = create_and_build(HeatMapBuilder, data, xgrid=xgrid, ygrid=ygrid, **kw)
  File "/home/ktx/.local/lib/python3.4/site-packages/bokeh/charts/builder.py", line 67, in create_and_build
    chart.add_builder(builder)
  File "/home/ktx/.local/lib/python3.4/site-packages/bokeh/charts/chart.py", line 152, in add_builder
    builder.create(self)
  File "/home/ktx/.local/lib/python3.4/site-packages/bokeh/charts/builder.py", line 512, in create
    self.process_data()
  File "/home/ktx/.local/lib/python3.4/site-packages/bokeh/charts/builders/heatmap_builder.py", line 171, in process_data
    columns=self.values.selection)
  File "/home/ktx/.local/lib/python3.4/site-packages/bokeh/charts/attributes.py", line 189, in setup
    self.attr_map = self._create_attr_map(self.data.to_df(), self.columns)
  File "/home/ktx/.local/lib/python3.4/site-packages/bokeh/charts/attributes.py", line 160, in _create_attr_map
    self._generate_items(df, columns)
  File "/home/ktx/.local/lib/python3.4/site-packages/bokeh/charts/attributes.py", line 232, in _generate_items
    bin_count=len(self.iterable), aggregate=False)
  File "/home/ktx/.local/lib/python3.4/site-packages/bokeh/charts/stats.py", line 311, in __init__
    super(Bins, self).__init__(**properties)
  File "/home/ktx/.local/lib/python3.4/site-packages/bokeh/charts/stats.py", line 56, in __init__
    self._refresh()
  File "/home/ktx/.local/lib/python3.4/site-packages/bokeh/charts/stats.py", line 62, in _refresh
    self.calculate()
  File "/home/ktx/.local/lib/python3.4/site-packages/bokeh/charts/stats.py", line 344, in calculate
    self.source.add(binned.tolist(), name=self.bin_column)
AttributeError: 'Categorical' object has no attribute 'tolist'
like image 599
ktx Avatar asked Feb 03 '16 22:02

ktx


People also ask

Why do we need heatmap in Python?

Since heatmaps provide us with an easy tool to understand the correlation between two entities, they can be used to visualize the correlation among the features of a machine learning model.

What should I plot on heatmap?

Heat maps are a standard way to plot grouped data. The basic idea of a heat map is that the graph is divided into rectangles or squares, each representing one cell on the data table, one row and one data set. The rectangle or square is color coded according to the value of that cell in the table.

How do you interpret a heatmap?

A heatmap (aka heat map) depicts values for a main variable of interest across two axis variables as a grid of colored squares. The axis variables are divided into ranges like a bar chart or histogram, and each cell's color indicates the value of the main variable in the corresponding cell range.

What is a 2d heatmap?

A heat map (or heatmap) is a data visualization technique that shows magnitude of a phenomenon as color in two dimensions. The variation in color may be by hue or intensity, giving obvious visual cues to the reader about how the phenomenon is clustered or varies over space.


2 Answers

bigreddot is right. If you have 0.11, you shouldn't have legacy_charts. Once you properly update Bokeh, this should work:

from bokeh.charts import HeatMap, output_file, show
import pandas as pd

output_file('test.html')

hm = HeatMap(z, x='date', y='hour',  values='i', stat='count')

show(hm)

enter image description here

like image 150
Carson Avatar answered Oct 17 '22 06:10

Carson


  1. On bigreddot pointers I reinstalled bokeh, didn't work even then. I got several times errors in pip3 (some bug on the linux distribution level).
  2. Then the python3-pip package, pandas and few others got purged.
  3. Afterwards rm -rf ~/.local/lib/python* was executed to cleanup the user-install direcotries.
  4. Then get-pip.py got downloaded.
  5. I reinstalled pip3 (+ ln -s ~/.local/bin/pip3 ~/bin) and reinstalled bokeh & pandas from the PyPi repositories.

Now everything works nicely. Thank you bigreddot for pointing in the right direction.

like image 1
ktx Avatar answered Oct 17 '22 08:10

ktx