0.12.14 (Feb 2018)

Bokeh Version 0.12.14 is an incremental update that adds a few important features and fixes several bugs. Some of the highlights include:

  • Addition of several tools to draw and edit point, rect, multi-line and patches glyphs (#6370) by modifying the underlying ColumnDataSource.

Many other small bugfixes and docs additions. For full details see the CHANGELOG.

Migration Guide

NOTE: the 0.12.x series is the last planned release series before a version 1.0 release. For more information see the project roadmap.

Deprecations Removed

The following deprecated features have been removed in this release:

  • DynamicImageRenderer (consider GeoViews instead)
  • BokehJS support for *.tsx templates (not typically user-facing)
  • autoload_server (use server_document or server_session instead)

New Runtime Dependency

The package packaging, available via both conda and pip, was added as a new runtime dependency.

Mapping of Unknown Catgorical Factors

Previously, data (e.g in a CDS column) referring to a categorical factor that did not exist in the relevant FactorRange, would cause an error in the browser. Now, any such attempted mappings will silently return NaN. Any data points with these factors as coordinates will not render.

The practical motivation for this change is that updating a FactorRange to have a new set of factors could result in an inconsistency triggering the error condition, causing plots to fail to render. With this change, the use-case of updating factor ranges should work more smoothly, however there will be no immediate indication of problems in case “bad” factors are included accidentally in data other than the data points not being rendered.

Change To Text Glyph Legend

Previously Text Glyphs added to legends would always unconditionally render the word “text” as the visual symbol, which was not useful. Now, text glyphs render an empty space in legends. This is helpful when it is desired to use an interactive legend mute or hide both a primary glyph, as well as some associated text that goes with it. For more discssion, see #7337.

MercatorTileSource change

MercatorTileSource models previously snapped to the closest zoom level resulting in user supplied axis ranges to be largely ignored. The default behavior has now been changed from snapping to the closest zoom level to simply maintaining the correct aspect ratio, while keeping the user defined bounds contained within the axis ranges.

The old behavior may be restored by setting enabling the snap_to_zoom property.

Defining views’ CSS classes

This was previously done through MyView.prototype.className, which didn’t respect class structure, so it was often necessary to duplicate CSS rules in sub-views. The new approach is to override css_classes() method, e.g.:

class MyView extends MyOtherView {
    css_classes() {
        return super.css_classes().concat("my-view")

This change affects only creators of custom extensions.


Previously HasProps.initialize() took attrs and options as its arguments. This was nearly never used and so it was removed. The preferred way to configure values of attributes is to use bokehjs’ properties system. This change affects only creators of custom extensions.