第一步 4:自定义绘图#
在前面的第一步指南中,您生成了不同的 Glyph 并添加了更多信息,例如标题、图例和注释。
在本节中,您将自定义整个绘图的外观。这包括调整绘图大小、更改其线条和颜色以及自定义轴和工具。
使用主题#
使用 Bokeh 的主题,您可以快速更改绘图的外观。主题是一组预定义的设计参数,例如颜色、字体或线条样式。
Bokeh 带有五个内置主题:caliber
、dark_minimal
、light_minimal
、night_sky
和contrast
。此外,您还可以定义自己的自定义主题。
要使用其中一个内置主题,请将您要使用的主题名称分配给文档的theme
属性
from bokeh.io import curdoc
from bokeh.plotting import figure, show
# prepare some data
x = [1, 2, 3, 4, 5]
y = [4, 5, 5, 7, 2]
# apply theme to current document
curdoc().theme = "dark_minimal"
# create a plot
p = figure(sizing_mode="stretch_width", max_width=500, height=250)
# add a renderer
p.line(x, y)
# show the results
show(p)
您还可以创建自己的主题以在多个绘图中使用。Bokeh 的主题可以是 YAML 或 JSON 格式。要了解有关创建和使用自定义主题的更多信息,请参阅用户指南中的创建自定义主题。
另请参阅
有关在 Bokeh 中使用主题的更多信息,请参阅用户指南中的使用主题和参考指南中的bokeh.themes
。
调整绘图大小#
Bokeh 的Plot
对象具有各种影响绘图外观的属性。
设置宽度和高度#
要设置绘图的大小,请在调用figure()
函数时使用width
和height
属性
from bokeh.plotting import figure, show
# prepare some data
x = [1, 2, 3, 4, 5]
y = [4, 5, 5, 7, 2]
# create a new plot with a specific size
p = figure(
title="Plot sizing example",
width=350,
height=250,
x_axis_label="x",
y_axis_label="y",
)
# add scatter renderer
p.scatter(x, y, fill_color="red", size=15)
# show the results
show(p)
类似于更改现有 Glyph 的设计,您可以在创建绘图后的任何时间更改绘图的属性
from bokeh.plotting import figure, show
# prepare some data
x = [1, 2, 3, 4, 5]
y = [4, 5, 5, 7, 2]
# create a new plot with a specific size
p = figure(
title="Plot resizing example",
width=350,
height=250,
x_axis_label="x",
y_axis_label="y",
)
# change plot size
p.width = 450
p.height = 150
# add scatter renderer
p.scatter(x, y, fill_color="red", size=15)
# show the results
show(p)
启用响应式绘图大小调整#
要使您的绘图自动调整到您的浏览器或屏幕大小,请使用sizing_mode
属性
from bokeh.plotting import figure, show
# prepare some data
x = [1, 2, 3, 4, 5]
y = [4, 5, 5, 7, 2]
# create a new plot with responsive width
p = figure(
title="Plot responsive sizing example",
sizing_mode="stretch_width",
height=250,
x_axis_label="x",
y_axis_label="y",
)
# add scatter renderer
p.scatter(x, y, fill_color="red", size=15)
# show the results
show(p)
自定义轴#
您可以设置各种属性来更改绘图中轴的工作方式和外观。
设置轴的外观#
自定义绘图外观的选项包括
为轴设置标签
设置与轴一起显示的数字的样式
定义轴本身的颜色和其他布局属性
例如
from bokeh.plotting import figure, show
# prepare some data
x = [1, 2, 3, 4, 5]
y = [4, 5, 5, 7, 2]
# create a plot
p = figure(
title="Customized axes example",
sizing_mode="stretch_width",
max_width=500,
height=350,
)
# add a renderer
p.scatter(x, y, size=10)
# change some things about the x-axis
p.xaxis.axis_label = "Temp"
p.xaxis.axis_line_width = 3
p.xaxis.axis_line_color = "red"
# change some things about the y-axis
p.yaxis.axis_label = "Pressure"
p.yaxis.major_label_text_color = "orange"
p.yaxis.major_label_orientation = "vertical"
# change things on all axes
p.axis.minor_tick_in = -3
p.axis.minor_tick_out = 6
# show the results
show(p)
定义轴范围#
在绘制绘图的轴时,Bokeh 会自动确定每个轴需要覆盖的范围,以便显示所有值。例如,如果 y 轴上的值介于 2 和 17 之间,Bokeh 会自动创建一个 y 轴,其范围从略低于 2 到略高于 17。
要手动定义轴的范围,请在调用figure()
函数时使用y_range()
函数或Plot
对象的y_range()
属性
from bokeh.plotting import figure, show
# prepare some data
x = [1, 2, 3, 4, 5]
y = [4, 5, 5, 7, 2]
# create a new plot with responsive width
p = figure(
y_range=(0, 25),
title="Axis range example",
sizing_mode="stretch_width",
max_width=500,
height=250,
)
# add scatter renderer with additional arguments
p.scatter(x, y, size=8)
# show the results
show(p)
格式化轴刻度#
您可以使用 Bokeh 的TickFormatter
对象格式化出现在轴旁边的文本。例如,使用这些格式化程序在 y 轴上显示货币符号
要在 y 轴上显示美元金额而不是数字,请使用NumeralTickFormatter
首先,从bokeh.models导入NumeralTickFormatter
from bokeh.models import NumeralTickFormatter
然后,在使用figure()
函数创建绘图后,将NumeralTickFormatter
分配给绘图的yaxis
的formatter
属性
p.yaxis[0].formatter = NumeralTickFormatter(format="$0.00")
NumeralTickFormatter
支持不同的格式,包括"$0.00"
以生成诸如"$7.42"
之类的值。
完成后的代码如下所示
from bokeh.models import NumeralTickFormatter
from bokeh.plotting import figure, show
# prepare some data
x = [1, 2, 3, 4, 5]
y = [4, 5, 5, 7, 2]
# create new plot
p = figure(
title="Tick formatter example",
sizing_mode="stretch_width",
max_width=500,
height=250,
)
# format axes ticks
p.yaxis[0].formatter = NumeralTickFormatter(format="$0.00")
# add renderers
p.scatter(x, y, size=8)
p.line(x, y, color="navy", line_width=1)
# show the results
show(p)
另请参阅
有关格式化刻度的更多信息,请参阅用户指南中的刻度标签格式。有关所有可用刻度格式化程序的列表,请参阅参考指南中的formatters
。
启用对数轴#
您还可以完全更改轴类型。使用y_axis_type="log"
切换到对数轴
from bokeh.plotting import figure, show
# prepare some data
x = [0.1, 0.5, 1.0, 1.5, 2.0, 2.5, 3.0]
y0 = [i**2 for i in x]
y1 = [10**i for i in x]
y2 = [10**(i**2) for i in x]
# create a new plot with a logarithmic axis type
p = figure(
title="Logarithmic axis example",
sizing_mode="stretch_width",
height=300,
max_width=500,
y_axis_type="log",
y_range=[0.001, 10 ** 11],
x_axis_label="sections",
y_axis_label="particles",
)
# add some renderers
p.line(x, x, legend_label="y=x")
p.scatter(x, x, legend_label="y=x", fill_color="white", size=8)
p.line(x, y0, legend_label="y=x^2", line_width=3)
p.line(x, y1, legend_label="y=10^x", line_color="red")
p.scatter(x, y1, legend_label="y=10^x", fill_color="red", line_color="red", size=6)
p.line(x, y2, legend_label="y=10^x^2", line_color="orange", line_dash="4 4")
# show the results
show(p)
启用日期时间轴#
将x_axis_type
或y_axis_type
设置为datetime
以在轴上显示日期或时间信息。然后,Bokeh 会创建一个DatetimeAxis
。
要格式化DatetimeAxis
的刻度,请使用DatetimeTickFormatter
。
import random
from datetime import datetime, timedelta
from bokeh.models import DatetimeTickFormatter, NumeralTickFormatter
from bokeh.plotting import figure, show
# generate list of dates (today's date in subsequent weeks)
dates = [(datetime.now() + timedelta(day * 7)) for day in range(0, 26)]
# generate 25 random data points
y = random.sample(range(0, 100), 26)
# create new plot
p = figure(
title="datetime axis example",
x_axis_type="datetime",
sizing_mode="stretch_width",
max_width=500,
height=250,
)
# add renderers
p.scatter(dates, y, size=8)
p.line(dates, y, color="navy", line_width=1)
# format axes ticks
p.yaxis[0].formatter = NumeralTickFormatter(format="$0.00")
p.xaxis[0].formatter = DatetimeTickFormatter(months="%b %Y")
# show the results
show(p)
自定义网格#
要更改网格的外观,请设置Plot
对象的xgrid()
、ygrid()
和grid()
方法的各种属性。
样式化线条#
通过设置各种grid_line
属性来更改网格的水平和垂直线条的外观
from bokeh.plotting import figure, show
# prepare some data
x = [1, 2, 3, 4, 5]
y = [4, 5, 5, 7, 2]
# create a plot
p = figure(
title="Customized grid lines example",
sizing_mode="stretch_width",
max_width=500,
height=250,
)
# add a renderer
p.line(x, y, line_color="green", line_width=2)
# change things only on the x-grid
p.xgrid.grid_line_color = "red"
# change things only on the y-grid
p.ygrid.grid_line_alpha = 0.8
p.ygrid.grid_line_dash = [6, 4]
# show the results
show(p)
另请参阅
有关线条和次要线条的更多信息,请参阅用户指南中的线条。
使用波段和边界#
使绘图更易于阅读的另一种方法是使用波段和边界。
波段和边界是您在使用注释中学到的注释的更多示例。
from bokeh.plotting import figure, show
# prepare some data
x = [1, 2, 3, 4, 5]
y = [4, 5, 5, 7, 2]
# create a plot
p = figure(
title="Bands and bonds example",
sizing_mode="stretch_width",
max_width=500,
height=250,
)
# add a renderer
p.line(x, y, line_color="green", line_width=2)
# add bands to the y-grid
p.ygrid.band_fill_color = "olive"
p.ygrid.band_fill_alpha = 0.1
# define vertical bonds
p.xgrid.bounds = (2, 4)
# show the results
show(p)
设置背景颜色#
您有几个选项可以在 Bokeh 中定义颜色。例如
使用其中一个命名的 CSS 颜色(例如,
"firebrick"
)使用十六进制值,前面加上
#
(例如"#00ff00"
)使用 3 元组表示 RGB 颜色(例如,
(100, 100, 255)
)使用 4 元组表示 RGBA 颜色(例如
(100, 100, 255, 0.5)
)
要更改 Bokeh 绘制绘图元素所用平面的外观,请使用 Plot
对象的各种 fill_color
属性。
from bokeh.plotting import figure, show
# prepare some data
x = [1, 2, 3, 4, 5]
y = [4, 5, 5, 7, 2]
# create a plot
p = figure(
title="Background colors example",
sizing_mode="stretch_width",
max_width=500,
height=250,
)
# add a renderer
p.line(x, y, line_color="green", line_width=2)
# change the fill colors
p.background_fill_color = (204, 255, 255)
p.border_fill_color = (102, 204, 255)
p.outline_line_color = (0, 0, 255)
# show the results
show(p)
另请参阅
有关 Bokeh 中颜色的更多信息,请参阅参考指南中 Color
的条目。
自定义工具栏#
Bokeh 带有一个功能强大的工具栏来探索绘图。您在第一个可视化中看到了这些工具,作为第一步指南 1的一部分。
工具栏定位#
要定义工具栏的位置,请使用 toolbar_location
属性以及以下值之一:above
、below
、left
、right
。
在创建图形时将值传递给 toolbar_location
。
p = figure(title="Toolbar positioning example", toolbar_location="below")
另一种选择是在创建图形后随时更改属性 toolbar_location
。
p.toolbar_location = "below"
停用和隐藏工具栏#
要完全停用工具栏,请将 toolbar_location
设置为 None
。
p.toolbar_location = None
要使工具栏自动隐藏,请将 autohide
设置为 True
。
from bokeh.plotting import figure, show
# prepare some data
x = [1, 2, 3, 4, 5]
y = [4, 5, 5, 7, 2]
# create a plot
p = figure(
title="Toolbar autohide example",
sizing_mode="stretch_width",
max_width=500,
height=250,
)
# activate toolbar autohide
p.toolbar.autohide = True
# add a renderer
p.line(x, y)
# show the results
show(p)
将 autohide
设置为 True
后,Bokeh 将隐藏工具栏,除非鼠标位于绘图区域内或您点击绘图区域内。
同样,使用 Toolbar
的 logo
属性停用 Bokeh 徽标。
p.toolbar.logo = None
自定义可用工具#
您可以自定义 Bokeh 在工具栏中显示哪些工具。有关所有可用工具的详细列表,请参阅用户指南中的绘图工具。
要自定义要使用的工具,您首先需要导入相关的工具。例如
from bokeh.models.tools import BoxZoomTool, ResetTool
接下来,通过将 tools
属性传递给 figure()
函数,定义在创建新图形时要使用的工具。
tools
属性接受工具列表。此示例仅启用 BoxZoomTool
和 ResetTool
。
p = figure(tools = [BoxZoomTool(), ResetTool()])
这样,工具栏中仅提供缩放框工具和重置工具。
要随时更改创建图形后的可用工具,请使用 add_tools()
和 remove_tools()
函数。
所有工具还提供各种属性来定义如何使用它们。例如,使用 PanTool
,您可以将移动限制为仅水平或垂直平移。默认行为是允许双向平移。
from bokeh.models import BoxZoomTool, PanTool, ResetTool
from bokeh.plotting import figure, show
# prepare some data
x = [1, 2, 3, 4, 5]
y = [4, 5, 5, 7, 2]
# create a plot
p = figure(
title="Modifying tools example",
tools=[BoxZoomTool(), ResetTool()],
sizing_mode="stretch_width",
max_width=500,
height=250,
)
# add an additional pan tool
# only vertical panning is allowed
p.add_tools(PanTool(dimensions="width"))
# add a renderer
p.scatter(x, y, size=10)
# show the results
show(p)
在此示例中,您首先在创建函数时包含缩放框工具和重置工具。接下来,您添加平移缩放工具。这将导致所有三个工具都可用。
添加工具提示#
工具提示是当您将鼠标悬停在数据点上或点击数据点时出现的的小窗口。
工具提示基于HoverTool
。悬停工具是 Bokeh 工具栏的一部分。
在 Bokeh 中启用工具提示的方法有多种。这是最快的方法。
tooltips
参数接受具有特殊语法的字符串。使用“@”符号包含您希望 Bokeh 显示数据的源的名称。此示例包含 @x
和 @y
。当浏览器显示工具提示时,Bokeh 会将这两个字段替换为列表 x
和 y
中的实际数据。
代码如下所示
from bokeh.models import HoverTool
from bokeh.plotting import figure, show
# prepare some data
x = [1, 2, 3, 4, 5]
y = [4, 5, 5, 7, 2]
p = figure(
y_range=(0, 10),
toolbar_location=None,
tools=[HoverTool()],
tooltips="Data point @x has the value @y",
sizing_mode="stretch_width",
max_width=500,
height=250,
)
# add renderers
p.scatter(x, y, size=10)
p.line(x, y, line_width=2)
# show the results
show(p)