线和曲线#

单条线#

下面的示例展示了如何使用line()图元方法从一维xy点序列生成单个线图元。

from bokeh.plotting import figure, show

p = figure(width=400, height=400)

# add a line renderer
p.line([1, 2, 3, 4, 5], [6, 7, 2, 4, 5], line_width=2)

show(p)

阶梯线#

对于某些类型的数据,数据点之间的离散阶梯可能比线性段更有效。要生成这种类型的数据表示,请使用step()图元方法。

from bokeh.plotting import figure, show

p = figure(width=400, height=400)

# add a steps renderer
p.step([1, 2, 3, 4, 5], [6, 7, 2, 4, 5], line_width=2, mode="center")

show(p)

调整mode参数以在每个阶梯的前面、后面或中间绘制阶梯水平。

多条线#

如果要一次绘制多条线,请按如下方式使用multi_line()图元方法

from bokeh.plotting import figure, show

p = figure(width=400, height=400)

p.multi_line([[1, 3, 2], [3, 4, 6, 6]], [[2, 1, 4], [4, 7, 8, 5]],
             color=["firebrick", "navy"], alpha=[0.8, 0.3], line_width=4)

show(p)

注意

与许多其他图元方法不同,multi_line()接受每条线的xy位置的列表列表。 multi_line()方法还为每条线的颜色、alpha和线宽等参数期望一个标量值或标量列表。您可以类似地使用一个ColumnDataSource,它包含点坐标的列表列表和长度匹配的标量值的列表。

缺失点#

您可以将NaN值传递给line()multi_line()图元。这会生成具有间隙的断开线,用于NaN值。

from math import nan

from bokeh.plotting import figure, show

p = figure(width=400, height=400)

# add a line renderer with NaN values
p.line([1, 2, 3, nan, 4, 5], [6, 7, 2, 4, 4, 5], line_width=2)

show(p)

堆叠线#

在处理百分比和其他类似数据的时间序列时,您可能希望堆叠具有共同索引的线。为此,您可以使用vline_stack()hline_stack()便捷方法。

from bokeh.models import ColumnDataSource
from bokeh.plotting import figure, show

source = ColumnDataSource(data=dict(
    x=[1, 2, 3, 4, 5],
    y1=[1, 2, 4, 3, 4],
    y2=[1, 4, 2, 2, 3],
))
p = figure(width=400, height=400)

p.vline_stack(['y1', 'y2'], x='x', source=source)

show(p)

注意

本章中的此示例和其他示例都依赖于ColumnDataSource进行数据结构化。有关如何使用此数据结构的信息,请参阅数据源

与标记结合#

您可以通过在单个figure()上调用其方法来组合单个绘图上的多个图元。

from bokeh.plotting import figure, show

x = [1, 2, 3, 4, 5]
y = [6, 7, 8, 7, 3]

p = figure(width=400, height=400)

# add both a line and circles on the same plot
p.line(x, y, line_width=2)
p.scatter(x, y, fill_color="white", size=8)

show(p)

此原则适用于所有bokeh.plotting图元方法。您可以根据需要向Bokeh绘图添加任意数量的图元。

专用图元#

线段#

要绘制多个单独的线段,请使用segment()ray()图元方法。

segment()方法接受起始点x0y0以及终点x1y1。它在这些点之间渲染线段。

from bokeh.plotting import figure, show

p = figure(width=400, height=400)
p.segment(x0=[1, 2, 3], y0=[1, 2, 3], x1=[1.2, 2.4, 3.1],
          y1=[1.2, 2.5, 3.7], color="#F4A582", line_width=3)

show(p)

射线#

ray()方法接受具有length(以屏幕单位为单位)和angle的起始点xyangle_units参数默认为"rad",但您也可以将其设置为"deg",以便以度而不是弧度测量角度。要获得始终延伸到绘图边缘的“无限”射线,请将length设置为0

from bokeh.plotting import figure, show

p = figure(width=400, height=400)
p.ray(x=[1, 2, 3], y=[1, 2, 3], length=45, angle=[30, 45, 60],
      angle_units="deg", color="#FB8072", line_width=2)

show(p)

跨度#

要绘制多个水平或垂直跨度(分别为无限宽度或高度的线),请使用hspan()vspan()图元方法。这些方法分别接受yx坐标分量。请注意,这些图元只能在一个轴上计算边界,因此可能需要在正交轴上进行显式范围指定,例如,如果单独使用。

from bokeh.io import show
from bokeh.plotting import figure

plot = figure()

plot.hspan(
    y=[0, 5, 15, 33],
    line_width=[1, 2, 3, 4], line_color="red",
)
plot.vspan(
    x=[0, 5, 15, 33],
    line_width=[1, 2, 3, 4], line_color="blue",
)

show(plot)

弧线#

要绘制简单的线弧,请使用arc()图元方法,该方法接受radiusstart_angleend_angle来确定位置。此外,direction属性确定是在起始角和结束角之间顺时针("clock")还是逆时针("anticlock")渲染。

from bokeh.plotting import figure, show

p = figure(width=400, height=400)
p.arc(x=[1, 2, 3], y=[1, 2, 3], radius=0.1, start_angle=0.4, end_angle=4.8, color="navy")

show(p)

参数化#

要绘制参数化的二次和三次曲线,请使用quadratic()bezier()图元方法。有关这些曲线的更多详细信息,请参阅参考文档