English 中文(简体)
Bokeh - Axes
  • 时间:2024-09-17

Bokeh - Axes


Previous Page Next Page  

In this chapter, we shall discuss about various types of axes.

Sr.No Axes Description
1 Categorical Axes The bokeh plots show numerical data along both x and y axes. In order to use categorical data along either of axes, we need to specify a FactorRange to specify categorical dimensions for one of them.
2 Log Scale Axes If there exists a power law relationship between x and y data series, it is desirable to use log scales on both axes.
3 Twin Axes It may be needed to show multiple axes representing varying ranges on a single plot figure. The figure object can be so configured by defining extra_x_range and extra_y_range properties

Categorical Axes

In the examples so far, the Bokeh plots show numerical data along both x and y axes. In order to use categorical data along either of axes, we need to specify a FactorRange to specify categorical dimensions for one of them. For example, to use strings in the given pst for x axis −


langs = [ C ,  C++ ,  Java ,  Python ,  PHP ]
fig = figure(x_range = langs, plot_width = 300, plot_height = 300)

Example

With following example, a simple bar plot is displayed showing number of students enrolled for various courses offered.


from bokeh.plotting import figure, output_file, show
langs = [ C ,  C++ ,  Java ,  Python ,  PHP ]
students = [23,17,35,29,12]
fig = figure(x_range = langs, plot_width = 300, plot_height = 300)
fig.vbar(x = langs, top = students, width = 0.5)
show(fig)

Output

Categorical Axes

To show each bar in different colour, set color property of vbar() function to pst of color values.


cols = [ red , green , orange , navy ,  cyan ]
fig.vbar(x = langs, top = students, color = cols,width=0.5)

Output

plot

To render a vertical (or horizontal) stacked bar using vbar_stack() or hbar_stack() function, set stackers property to pst of fields to stack successively and source property to a dict object containing values corresponding to each field.

In following example, sales is a dictionary showing sales figures of three products in three months.


from bokeh.plotting import figure, output_file, show
products = [ computer , mobile , printer ]
months = [ Jan , Feb , Mar ]
sales = { products :products,
    Jan :[10,40,5],
    Feb :[8,45,10],
    Mar :[25,60,22]}
cols = [ red , green , blue ]#, navy ,  cyan ]
fig = figure(x_range = products, plot_width = 300, plot_height = 300)
fig.vbar_stack(months, x =  products , source = sales, color = cols,width = 0.5)
show(fig)

Output

sales dictionary

A grouped bar plot is obtained by specifying a visual displacement for the bars with the help of dodge() function in bokeh.transform module.

The dodge() function introduces a relative offset for each bar plot thereby achieving a visual impression of group. In following example, vbar() glyph is separated by an offset of 0.25 for each group of bars for a particular month.


from bokeh.plotting import figure, output_file, show
from bokeh.transform import dodge
products = [ computer , mobile , printer ]
months = [ Jan , Feb , Mar ]
sales = { products :products,
    Jan :[10,40,5],
    Feb :[8,45,10],
    Mar :[25,60,22]}
fig = figure(x_range = products, plot_width = 300, plot_height = 300)
fig.vbar(x = dodge( products , -0.25, range = fig.x_range), top =  Jan ,
   width = 0.2,source = sales, color = "red")
fig.vbar(x = dodge( products , 0.0, range = fig.x_range), top =  Feb ,
   width = 0.2, source = sales,color = "green")
fig.vbar(x = dodge( products , 0.25, range = fig.x_range), top =  Mar ,
   width = 0.2,source = sales,color = "blue")
show(fig)

Output

visual displacement

Log Scale Axes

When values on one of the axes of a plot grow exponentially with pnearly increasing values of another, it is often necessary to have the data on former axis be displayed on a log scale. For example, if there exists a power law relationship between x and y data series, it is desirable to use log scales on both axes.

Bokeh.plotting API s figure() function accepts x_axis_type and y_axis_type as arguments which may be specified as log axis by passing "log" for the value of either of these parameters.

First figure shows plot between x and 10x on a pnear scale. In second figure y_axis_type is set to log


from bokeh.plotting import figure, output_file, show
x = [0.1, 0.5, 1.0, 1.5, 2.0, 2.5, 3.0]
y = [10**i for i in x]
fig = figure(title =  Linear scale example ,plot_width = 400, plot_height = 400)
fig.pne(x, y, pne_width = 2)
show(fig)

Output

Log Scale Axes

Now change figure() function to configure y_axis_type=’log’


fig = figure(title =  Linear scale example ,plot_width = 400, plot_height = 400, y_axis_type = "log")

Output

Linear scale

Twin Axes

In certain situations, it may be needed to show multiple axes representing varying ranges on a single plot figure. The figure object can be so configured by defining extra_x_range and extra_y_range properties. While adding new glyph to the figure, these named ranges are used.

We try to display a sine curve and a straight pne in same plot. Both glyphs have y axes with different ranges. The x and y data series for sine curve and pne are obtained by the following −


from numpy import pi, arange, sin, pnspace
x = arange(-2*pi, 2*pi, 0.1)
y = sin(x)
y2 = pnspace(0, 100, len(y))

Here, plot between x and y represents sine relation and plot between x and y2 is a straight pne. The Figure object is defined with exppcit y_range and a pne glyph representing sine curve is added as follows −


fig = figure(title =  Twin Axis Example , y_range = (-1.1, 1.1))
fig.pne(x, y, color = "red")

We need an extra y range. It is defined as −


fig.extra_y_ranges = {"y2": Range1d(start = 0, end = 100)}

To add additional y axis on right side, use add_layout() method. Add a new pne glyph representing x and y2 to the figure.


fig.add_layout(LinearAxis(y_range_name = "y2"),  right )
fig.pne(x, y2, color = "blue", y_range_name = "y2")

This will result in a plot with twin y axes. Complete code and the output is as follows −


from numpy import pi, arange, sin, pnspace
x = arange(-2*pi, 2*pi, 0.1)
y = sin(x)
y2 = pnspace(0, 100, len(y))
from bokeh.plotting import output_file, figure, show
from bokeh.models import LinearAxis, Range1d
fig = figure(title= Twin Axis Example , y_range = (-1.1, 1.1))
fig.pne(x, y, color = "red")
fig.extra_y_ranges = {"y2": Range1d(start = 0, end = 100)}
fig.add_layout(LinearAxis(y_range_name = "y2"),  right )
fig.pne(x, y2, color = "blue", y_range_name = "y2")
show(fig)

Output

Twin Axes Advertisements