We are excited to announce the release of version 0.6 of Bokeh, an interactive web plotting library for Python!

This release includes some major new features:

  • Abstract Rendering recipes for large data sets: isocontour, heatmap
  • New charts in bokeh.charts: Time Series and Categorical Heatmap
  • Sophisticated Hands-on Table widget
  • Complete Python 3 support for bokeh-server
  • Much expanded User Guide and Dev Guide
  • Multiple axes and ranges now supported
  • Object query interface to help with plot styling
  • Hit-testing (hover tool support) for patch glyphs

I’d also like to announce a new Github Organization for Bokeh. Currently it is home to bokeh-scala and bokeh.jl but the Bokeh project itself will be moved there before the next 0.7 release. Implementors of new language bindings are encouraged to contact us about hosting your project under this organization.

Get It Now!

If you are using Anaconda, you can install with conda:

    conda install bokeh

Alternatively, you can install with pip:

    pip install bokeh

In order to push features to users even faster there are also now periodic dev builds made available. See the Developer’s Guide for more details.

BokehJS is also available by CDN for use in standalone Javascript applications:


Additionally, BokehJS is also now installable with the Node Package Manager.

New Charts

The bokeh.charts API presents very high level schematic statistical charts, available with just a couple of lines of code. New in this release are Categorical Heatmaps and Time Series charts. Here are couple of examples:

A categorical heatmap of unemployment data:

See Code

from bokeh.sampledata.unemployment1948 import data
    # pandas magic
    df = data[data.columns[:-2]]
    df2 = df.set_index(df[df.columns[0]].astype(str))
    df2.drop(df.columns[0], axis=1, inplace=True)
    df3 = df2.transpose()
    # bokeh magic
    from bokeh.charts import CategoricalHeatMap
    hm = CategoricalHeatMap(
        df3, title="categorical heatmap, pd input",





A timeseries generate from a Pandas DataFrame:


See Code


from collections import OrderedDict
    import pandas as pd
    AAPL = pd.read_csv("aapl.csv", parse_dates=["Date"])
    MSFT = pd.read_csv( "msft.csv", parse_dates=["Date"])
    IBM = pd.read_csv( "ibm.csv", parse_dates=["Date"])
    xyvalues = OrderedDict(
        AAPL = AAPL[("Date", "Adj Close")],
        MSFT = MSFT[("Date", "Adj Close")],
        IBM  = IBM[("Date", "Adj Close")],
    df = pd.concat(xyvalues, axis=1, names=["l0", "l1"])
    from bokeh.charts import TimeSeries
    ts = TimeSeries(
        df, title="timeseries, pd_input",



Many other chart types are planned for the near future: candlestick plots, violin plots, stacked areas, etc.

Abstract Rendering

The new user guide section for Abstract Rendering has a lot of information about the design and goals of Abstract Rendering (AR), but in a nutshell: AR is about being able to handle the situations where you have more points than pixels.

To accomplish this, AR pre-rasterizes the visualization and uses information collected during this process to produce a new visualization. The goal is to provide flexibility for achieving better data fidelity in the visualization. This fidelity may be expressed as better use of the dynamic range of colors (as in heat map) or by transforming thee visualization to a new type (as in contours).

Abstract Rendering is currently a work in progress, but new capability is being added rapidly. Generating iso-contours from datasets is one new AR feature just added in 0.6. Here is an example showing contours of data based off of 70k census tracts:

Additionally, existing capabilities have been made easier to use with the new Abstract Rendering “recipes” interface. Here is a heat map of a 2 million node adjacency graph:

Look forward to much more in the way of AR functionality in the coming months.

Hands-on Table

This release also includes a configurable Hands-on Table widget. You can sort the columns and connect selections in your plot to selections on the table.

Multiple Axes

It’s possible to have multiple axes and scales in Bokeh thanks to the new dynamic layout capability provided by kiwi.js:

This is only the start of the new layout-based features coming to Bokeh. Expect to see more sophisticated grid- and sub-plots, colorbar axes, automatic annotation positioning, and layout driven directly by data.

What’s Next?

The release of Bokeh 0.7 is planned for October. Some notable features we intend to work on are:

  • Design and usability improvements to widgets and dashboards
  • Additional chart types (violin, contour, etc.), auto-faceting for bokeh.charts
  • Dynamic and data-driven layout for subplots and annotations
  • New language bindings
  • Polar coordinate systems

How to get involved

Issues, enhancement requests, and pull requests can be made on the Bokeh Github page: https://github.com/continuumio/bokeh

Questions can be directed to the Bokeh mailing list: [email protected]

If you would like some help incorporating Bokeh into your Notebooks, apps, or dashboards, please send an email to [email protected] to inquire about Continuum’s training and consulting services – not just for Bokeh, but for anything in the full NumPy/SciPy/PyData stack.