Bokeh 轴
在本章中,我们将讨论各种类型的轴。
序号 | 轴 | 说明 |
---|---|---|
1 | 分类轴 | Bokeh图沿x轴和y轴显示数字数据。为了在其中一个轴上使用分类数据,我们需要指定一个FactorRange来指定其中一个轴的分类尺寸。 |
2 | 对数尺度轴 | 如果x和y数据系列之间存在幂律关系,最好在两个坐标轴上使用对数刻度。 |
3 | 双轴 | 可能需要在一个图上显示代表不同范围的多个坐标轴。通过定义 extra_x_range 和 extra_y_range 属性,可以对图形对象进行这样的配置 |
分类轴
在迄今为止的例子中,Bokeh图沿x轴和y轴显示数字数据。为了沿任一轴使用分类数据,我们需要指定一个FactorRange来为其中一个轴指定分类维度。例如,为了在X轴上使用给定列表中的字符串:
langs = ['C', 'C++', 'Java', 'Python', 'PHP']
fig = figure(x_range = langs, plot_width = 300, plot_height = 300)
例子
在下面的例子中,一个简单的柱状图显示了各种课程的注册学生人数。
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)
输出
要以不同的颜色显示每个条形图,请将vbar()函数的颜色属性设置为颜色值的列表。
cols = ['red','green','orange','navy', 'cyan']
fig.vbar(x = langs, top = students, color = cols,width=0.5)
输出
要使用vbar_stack()或hbar_stack()函数渲染一个垂直(或水平)的堆叠条,将stackers属性设置为要连续堆叠的字段列表,将source属性设置为包含每个字段对应的值的dict对象。
在下面的例子中,sales是一个显示三个月内三种产品的销售数字的字典。
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)
输出
在 bokeh.transform 模块中的dodge()函数的帮助下,通过为条形图指定一个视觉位移,得到一个分组条形图。
dodge()函数 为每个条形图引入了一个相对的偏移,从而实现了分组的视觉印象。在下面的例子中, vbar()字形 对某一月份的每一组条形图都有0.25的偏移。
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)
输出
对数刻度轴
当一个图的一个轴上的值随着另一个轴上的值的线性增长而呈指数增长时,通常需要将前一个轴上的数据以对数尺度显示。例如,如果x和y数据系列之间存在幂律关系,最好在两个轴上都使用对数标度。
Bokeh.plotting API的figure()函数接受x_axis_type和y_axis_type作为参数,通过传递 “log “作为这些参数的值,可以指定为对数轴。
第一幅图显示了x和10x之间的线性比例图。在第二个图中,y_axis_type被设置为 “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.line(x, y, line_width = 2)
show(fig)
输出
现在改变figure()函数以配置y_axis_type=’log’。
fig = figure(title = 'Linear scale example',plot_width = 400, plot_height = 400, y_axis_type = "log")
输出
双轴
在某些情况下,可能需要在一个绘图图上显示代表不同范围的多个轴。图形对象可以通过定义 extra_x_range 和 extra_y_range 属性进行配置。当向图中添加新的字形时,这些命名的范围会被使用。
我们试图在同一个图中显示一条正弦曲线和一条直线。两个字形都有不同范围的y轴。正弦曲线和直线的x和y数据系列是通过以下方法得到的
from numpy import pi, arange, sin, linspace
x = arange(-2*pi, 2*pi, 0.1)
y = sin(x)
y2 = linspace(0, 100, len(y))
这里,x和y之间的图表示正弦关系,x和y2之间的图是一条直线。图形对象是用明确的y_range定义的,并且添加了一个代表正弦曲线的线条字形,如下所示
fig = figure(title = 'Twin Axis Example', y_range = (-1.1, 1.1))
fig.line(x, y, color = "red")
我们需要一个额外的y范围。它被定义为-
fig.extra_y_ranges = {"y2": Range1d(start = 0, end = 100)}
要在右侧添加额外的y轴,请使用add_layout()方法。在图中添加一个新的代表x和y2的线条字形。
fig.add_layout(LinearAxis(y_range_name = "y2"), 'right')
fig.line(x, y2, color = "blue", y_range_name = "y2")
这将产生一个具有双Y轴的图。完整的代码和输出如下
from numpy import pi, arange, sin, linspace
x = arange(-2*pi, 2*pi, 0.1)
y = sin(x)
y2 = linspace(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.line(x, y, color = "red")
fig.extra_y_ranges = {"y2": Range1d(start = 0, end = 100)}
fig.add_layout(LinearAxis(y_range_name = "y2"), 'right')
fig.line(x, y2, color = "blue", y_range_name = "y2")
show(fig)
输出