python Bokeh库学习记录

First steps 2: 添加和自定义渲染器

之前的入门指南中,你使用了Bokeh的figure()函数来绘制折线图。

在本节中,你将使用不同的渲染函数来创建各种其他类型的图表。你还将自定义你的图像外观。

渲染不同的图形符号

Bokeh的绘图界面支持多种不同的图形符号,如线条、条形图、六边形瓦片或其他多边形。

所有支持的图形符号方法的完整列表可在Bokeh的figure()函数参考指南中找到。有关Bokeh图形符号的详细信息,请参阅Bokeh用户指南中的基本绘图部分。

渲染圆形

使用circle()函数代替line()函数来渲染圆形:

python 复制代码
p.scatter(x, y3, legend_label="Objects", color="yellow", size=12)

将之前可视化中的一个line()函数替换为circle()函数,以创建圆形图:

python 复制代码
from bokeh.plotting import figure, show

# prepare some data
x = [1, 2, 3, 4, 5]
y1 = [6, 7, 2, 4, 5]
y2 = [2, 3, 4, 5, 6]
y3 = [4, 5, 5, 7, 2]

# create a new plot with a title and axis labels
p = figure(title="Multiple glyphs example", x_axis_label="x", y_axis_label="y")

# add multiple renderers
p.line(x, y1, legend_label="Temp.", color="#004488", line_width=3)
p.line(x, y2, legend_label="Rate", color="#906c18", line_width=3)
p.scatter(x, y3, legend_label="Objects", color="#bb5566", size=16)

# show the results
show(p)

渲染条形图

同样地,使用vbar()函数渲染垂直条形图:

python 复制代码
p.vbar(x=x, top=y2, legend_label="Rate", width=0.5, bottom=0, color="red")

vbar()函数添加到你之前的可视化中:

另见

要了解更多关于条形图以及Bokeh处理分类数据的其他方法,请参阅用户指南中的条形图部分。

自定义图形符号

不同的渲染函数接受各种参数来控制图形符号的外观。

定义新图形符号的属性

例如,circle()函数让你定义圆形的颜色或直径等:

  • fill_color:圆形的填充颜色
  • fill_alpha:填充颜色的透明度(0到1之间的任何值)
  • line_color:圆形轮廓的颜色
  • size:圆形的大小(单位为像素或点)
  • legend_label:圆形的图例标签

请注意,在之前的例子中,你使用color属性来定义对象的颜色。color是一个别名,可自动将对象的所有颜色属性设置为相同的颜色。例如,将"yellow"传递给圆形的color属性,与单独设置fill_color和line_color为黄色是一样的。

在Bokeh中,你可以通过几种方式设置颜色。例如:

  • 使用命名颜色(例如,"firebrick")
  • 使用带#前缀的十六进制值(例如,"#00ff00")
  • 使用表示RGB颜色的3元组(例如,(100, 100, 255))
  • 使用表示RGBA颜色的4元组(例如,(100, 100, 255, 0.5))

创建带有图例标签"Objects"的圆形,并使圆形填充颜色为红色、轮廓颜色为蓝色且略微透明:

python 复制代码
p.circle(x, y, legend_label="Objects", fill_color="red", fill_alpha=0.6, line_color="blue")
python 复制代码
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 title and axis labels
p = figure(title="Glyphs properties example", x_axis_label="x", y_axis_label="y")

# add circle renderer with additional arguments
p.scatter(
    x,
    y,
    marker="circle",
    size=80,
    legend_label="Objects",
    fill_color="red",
    fill_alpha=0.5,
    line_color="blue",
)

# show the results
show(p)

更改现有图形符号的属性

如果在创建对象后想要更改任何属性,可以直接定义和覆盖对象的属性。

以以上的圆形为例。你通过传递参数fill_color="red"定义圆形为红色。

要将你的圆形颜色从红色改为蓝色,你首先需要在调用circle()函数时为新的对象分配一个变量名(例如scatter)。

python 复制代码
scatter = p.scatter(
    marker="circle",
    x=x,
    y=y,
    size=80,
    legend_label="Objects",
    fill_color="red",
    fill_alpha=0.5,
    line_color="blue",
)

接下来,使用该变量访问对象的glyph属性并更改其属性:

python 复制代码
glyph = scatter.glyph
glyph.fill_color = "blue"

再次生成红色圆形,但这次在输出图形之前将其颜色更改为蓝色:

python 复制代码
from bokeh.plotting import figure, show

p = figure()

# 创建红色圆形
scatter = p.circle(
    x=[1, 2, 3, 4, 5],
    y=[6, 7, 2, 4, 5],
    size=80,
    legend_label="Objects",
    fill_color="red",
    fill_alpha=0.5,
    line_color="blue",
)

# 更改颜色为蓝色
scatter.glyph.fill_color = "blue"

show(p)

另见

有关各种视觉属性的更多信息,请参阅用户指南中的样式化图形符号通用视觉属性部分。

每种类型的图形符号都有不同的属性。请参阅参考指南中的figure()以查看每种图形符号方法的所有可用属性。

First steps 3: 添加图例、文本和注释

之前的第一步指南中,你生成了不同的图形符号并定义了它们的外观。

在本节中,你将添加和样式化一个图例和一个标题。你还将通过包括注释来为你的绘图添加额外的信息。

添加和样式化图例

在调用渲染函数时,如果包括了legend_label属性,Bokeh会自动将图例添加到你的绘图中。例如:

python 复制代码
p.circle(x, y3, legend_label="Objects")

这将在你的绘图中添加一个带有"Objects"条目的图例。

使用Legend对象的属性可以自定义图例。例如:

python 复制代码
from bokeh.plotting import figure, show
from bokeh.models import Legend

# 创建数据
x = [1, 2, 3, 4, 5]
y1 = [6, 7, 2, 4, 5]
y2 = [2, 3, 4, 6, 7]
y3 = [4, 5, 5, 7, 8]

# 创建绘图
p = figure(title="My Plot")

# 添加圆形图
p.circle(x, y3, legend_label="Objects", size=10, fill_color="red", fill_alpha=0.6, line_color="blue")

# 自定义图例
p.legend.title = 'Legend Title'
p.legend.label_text_font_size = '12pt'
p.legend.background_fill_color = 'lightgray'
p.legend.background_fill_alpha = 0.5
p.legend.border_line_color = 'black'
p.legend.border_line_width = 1

show(p)

这个示例会为你的绘图添加一个带有标题"Legend Title"的图例,并自定义其外观。你可以调整图例的背景颜色、字体大小、边框等属性。

python 复制代码
另见
要了解更多关于图例的内容,请参阅用户指南中的[图例](https://docs.bokeh.org/en/latest/docs/user_guide/basic/annotations.html#ug-basic-annotations-legends)部分和[样式化图例](https://docs.bokeh.org/en/latest/docs/user_guide/styling/plots.html#ug-styling-plots-legends)部分。参考指南中的Legend条目包含了图例的所有可用属性列表。
参阅用户指南中的[交互式图例](https://docs.bokeh.org/en/latest/docs/user_guide/interaction/legends.html#ug-interaction-legends)以了解如何使用图例隐藏

定制标题

到目前为止,大多数示例都包含了标题。这是通过将title参数传递给figure()函数实现的:

python 复制代码
p = figure(title="Headline example")

有多种方式可以设置标题文本的样式。例如:

python 复制代码
from bokeh.plotting import figure, show

# 创建绘图并添加标题
p = figure(title="My Custom Headline")

# 定制标题样式
p.title.text_color = "navy"
p.title.text_font = "times"
p.title.text_font_style = "italic"
p.title.text_font_size = "16pt"
p.title.align = "center"
p.title.background_fill_color = "beige"

show(p)

这个示例将创建一个包含自定义样式标题的绘图。你可以调整标题的颜色、字体、字体样式、字体大小、对齐方式和背景填充颜色等属性。

另见

有关使用标题的更多信息,请参阅用户指南中的标题部分。在参考指南中,Title条目包含了所有可用属性的列表

使用注释

注释是你添加到绘图中的视觉元素,使其更易于阅读。有关各种注释的更多信息,请参阅用户指南中的注释部分。

一个例子是矩形注释。你可以使用矩形注释来突出绘图中的某些区域:

要向绘图中添加矩形注释,首先需要从bokeh.models导入BoxAnnotation类:

python 复制代码
from bokeh.models import BoxAnnotation

接下来,创建BoxAnnotation对象。如果未为bottom或top传递值,Bokeh会自动将矩形的维度扩展到绘图的边缘:

python 复制代码
low_box = BoxAnnotation(top=20, fill_alpha=0.2, fill_color="#F0E442")
mid_box = BoxAnnotation(bottom=20, top=80, fill_alpha=0.2, fill_color="#009E73")
high_box = BoxAnnotation(bottom=80, fill_alpha=0.2, fill_color="#F0E442")

最后,你需要将BoxAnnotation对象添加到现有的figure中。使用add_layout()方法添加你的矩形:

python 复制代码
p.add_layout(low_box)
p.add_layout(mid_box)
p.add_layout(high_box)

完成的代码如下所示:

python 复制代码
import random
from bokeh.models import BoxAnnotation
from bokeh.plotting import figure, show

# 生成一些数据(1-50作为x,随机值作为y)
x = list(range(0, 51))
y = random.sample(range(0, 100), 51)

# 创建新绘图
p = figure(title="Box annotation example")

# 添加线条渲染器
line = p.line(x, y, line_color="#000000", line_width=2)

# 添加矩形注释
low_box = BoxAnnotation(top=20, fill_alpha=0.2, fill_color="#F0E442")
mid_box = BoxAnnotation(bottom=20, top=80, fill_alpha=0.2, fill_color="#009E73")
high_box = BoxAnnotation(bottom=80, fill_alpha=0.2, fill_color="#F0E442")

# 将矩形添加到现有绘图中
p.add_layout(low_box)
p.add_layout(mid_box)
p.add_layout(high_box)

# 显示结果
show(p)

另见

要了解Bokeh中不同种类的注释,请参阅用户指南中的注释部分。

First steps 4::定制你的绘图

前面的第一步指南中,你生成了不同的图形符号并添加了更多信息,如标题、图例和注释。

在本节中,你将整体定制绘图的外观。这包括调整大小、改变线条和颜色,以及定制坐标轴工具

使用主题

借助Bokeh的主题,你可以快速改变绘图的外观。主题是一组预定义的设计参数,如颜色、字体或线条样式。

Bokeh自带五个内置主题:caliber、dark_minimal、light_minimal、night_sky和contrast。此外,你还可以定义自己的自定义主题。

要使用其中一个内置主题,将你想使用的主题名称分配给文档的theme属性:

python 复制代码
from bokeh.io import curdoc
from bokeh.plotting import figure, show

# 准备一些数据
x = [1, 2, 3, 4, 5]
y = [4, 5, 5, 7, 2]

# 将主题应用到当前文档
curdoc().theme = "dark_minimal"

# 创建绘图
p = figure(sizing_mode="stretch_width", max_width=500, height=250)

# 添加渲染器
p.line(x, y)

# 显示结果
show(p)

你也可以创建自己的主题,以在多个绘图中使用。Bokeh的主题可以是YAML或JSON格式。要了解更多关于创建和使用自定义主题的信息,请参阅用户指南中的创建自定义主题部分。

另见

有关在Bokeh中使用主题的更多信息,请参阅用户指南中的使用主题部分和参考指南中的bokeh.themes部分。

调整绘图大小

Bokeh 的 Plot 对象具有各种属性,这些属性会影响绘图的外观。

设置宽度和高度

要设置绘图的尺寸,可以在调用 figure() 函数时使用 widthheight 属性:

python 复制代码
from bokeh.plotting import figure, show

# 准备一些数据
x = [1, 2, 3, 4, 5]
y = [4, 5, 5, 7, 2]

# 创建一个具有特定大小的新绘图
p = figure(
    title="Plot sizing example",
    width=350,
    height=250,
    x_axis_label="x",
    y_axis_label="y",
)

# 添加散点渲染器
p.scatter(x, y, fill_color="red", size=15)

# 显示结果
show(p)

更改现有图形符号的设计类似,您可以在创建绘图后随时更改其属性:

python 复制代码
from bokeh.plotting import figure, show

# 准备一些数据
x = [1, 2, 3, 4, 5]
y = [4, 5, 5, 7, 2]

# 创建一个具有特定大小的新绘图
p = figure(
    title="Plot resizing example",
    width=350,
    height=250,
    x_axis_label="x",
    y_axis_label="y",
)

# 改变绘图大小
p.width = 450
p.height = 150

# 添加散点渲染器
p.scatter(x, y, fill_color="red", size=15)

# 显示结果
show(p)

启用响应式绘图大小

要使绘图自动调整到浏览器或屏幕大小,可以使用 sizing_mode 属性:

python 复制代码
from bokeh.plotting import figure, show

# 准备一些数据
x = [1, 2, 3, 4, 5]
y = [4, 5, 5, 7, 2]

# 创建一个具有响应式宽度的新绘图
p = figure(
    title="Plot responsive sizing example",
    sizing_mode="stretch_width",
    height=250,
    x_axis_label="x",
    y_axis_label="y",
)

# 添加散点渲染器
p.scatter(x, y, fill_color="red", size=15)

# 显示结果
show(p)

另见

要了解更多有关如何控制绘图大小的信息,请参阅用户指南中的样式化绘图部分和参考指南中的
Plot

条目。

有关响应式大小调整的更多信息,请参阅用户指南中的大小模式部分和参考指南中的
sizing_mode 条目。

自定义坐标轴

你可以设置各种属性来改变绘图中坐标轴的工作方式和外观。

设置坐标轴的外观

自定义绘图外观的选项包括:

  • 设置坐标轴标签
  • 样式化坐标轴上的数字
  • 定义坐标轴本身的颜色和其他布局属性

例如:

python 复制代码
from bokeh.plotting import figure, show

# 准备一些数据
x = [1, 2, 3, 4, 5]
y = [4, 5, 5, 7, 2]

# 创建绘图
p = figure(
    title="Customized axes example",
    sizing_mode="stretch_width",
    max_width=500,
    height=350,
)

# 添加渲染器
p.scatter(x, y, size=10)

# 修改一些关于 x 轴的设置
p.xaxis.axis_label = "Temp"
p.xaxis.axis_line_width = 3
p.xaxis.axis_line_color = "red"

# 修改一些关于 y 轴的设置
p.yaxis.axis_label = "Pressure"
p.yaxis.major_label_text_color = "orange"
p.yaxis.major_label_orientation = "vertical"

# 修改所有坐标轴的设置
p.axis.minor_tick_in = -3
p.axis.minor_tick_out = 6

# 显示结果
show(p)

以上代码示例展示了如何自定义坐标轴的标签、线条宽度、颜色、标签颜色等属性。

另见

要了解更多关于自定义绘图坐标轴的信息,请参阅用户指南和参考指南中的相应部分

定义坐标轴范围

在绘制坐标轴时,Bokeh会自动确定每个坐标轴需要覆盖的范围,以便显示所有值。例如,如果y轴上的值在2到17之间,Bokeh会自动创建一个y轴,其范围略低于2和略高于17。

要手动定义坐标轴范围,可以在调用figure()函数时使用 y_range 属性或 x_range 属性:

python 复制代码
from bokeh.plotting import figure, show

# 准备一些数据
x = [1, 2, 3, 4, 5]
y = [4, 5, 5, 7, 2]

# 创建一个具有响应式宽度的新绘图
p = figure(
    y_range=(0, 25),  # 手动设置y轴范围
    title="Axis range example",
    sizing_mode="stretch_width",
    max_width=500,
    height=250,
)

# 添加散点渲染器
p.scatter(x, y, size=8)

# 显示结果
show(p)

通过以上代码,你可以手动设置y轴的范围为0到25。你也可以使用类似的方法来设置x轴的范围。

格式化坐标轴刻度

你可以使用 Bokeh 的 TickFormatter 对象来格式化坐标轴旁边显示的文本。例如,可以在y轴上显示货币符号。

使用 NumeralTickFormatter 来在y轴上显示美元金额:

示例代码

首先,从 bokeh.models 导入 NumeralTickFormatter

python 复制代码
from bokeh.models import NumeralTickFormatter

然后,在用 figure() 函数创建绘图之后,将 NumeralTickFormatter 分配给绘图的 y 轴的格式化器属性:

python 复制代码
p.yaxis[0].formatter = NumeralTickFormatter(format="$0.00")

以下是完整的代码示例:

python 复制代码
from bokeh.models import NumeralTickFormatter
from bokeh.plotting import figure, show

# 准备一些数据
x = [1, 2, 3, 4, 5]
y = [4, 5, 5, 7, 2]

# 创建新绘图
p = figure(
    title="Tick formatter example",
    sizing_mode="stretch_width",
    max_width=500,
    height=250,
)

# 格式化 y 轴刻度
p.yaxis[0].formatter = NumeralTickFormatter(format="$0.00")

# 添加渲染器
p.scatter(x, y, size=8)
p.line(x, y, color="navy", line_width=1)

# 显示结果
show(p)

通过上述代码,你可以将y轴上的刻度格式化为显示美元金额,如 "$7.42"。

另见 有关格式化刻度的更多信息,请参阅用户指南中的 Tick label
formats
。欲了解可用的所有刻度格式化器列表,请参见参考指南中的
formatters

启用对数坐标轴

你还可以更改坐标轴类型。使用 y_axis_type="log" 来切换到对数坐标轴:

示例代码
python 复制代码
from bokeh.plotting import figure, show

# 准备一些数据
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]

# 创建一个具有对数坐标轴的新绘图
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],  # 设置 y 轴范围
    x_axis_label="sections",  # x 轴标签
    y_axis_label="particles",  # y 轴标签
)

# 添加一些渲染器
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(p)

通过上述代码,你可以创建一个具有对数 y 轴的绘图,并显示不同函数上的数据点,如 y=xy=x^2y=10^xy=10^x^2

这个设置使得绘图更适合显示跨越多个数量级的数据。

启用日期时间坐标轴

设置 x_axis_typey_axis_type"datetime" 可以在坐标轴上显示日期或时间信息。Bokeh 会创建一个 DatetimeAxis

要格式化 DatetimeAxis 的刻度,请使用 DatetimeTickFormatter

示例代码
python 复制代码
import random
from datetime import datetime, timedelta

from bokeh.models import DatetimeTickFormatter, NumeralTickFormatter
from bokeh.plotting import figure, show

# 生成日期列表(今天日期的后续几周)
dates = [(datetime.now() + timedelta(days=day * 7)) for day in range(0, 26)]

# 生成25个随机数据点
y = random.sample(range(0, 100), 26)

# 创建新绘图
p = figure(
    title="datetime axis example",
    x_axis_type="datetime",  # 启用日期时间坐标轴
    sizing_mode="stretch_width",
    max_width=500,
    height=250,
)

# 添加渲染器
p.scatter(dates, y, size=8)
p.line(dates, y, color="navy", line_width=1)

# 格式化坐标轴刻度
p.yaxis[0].formatter = NumeralTickFormatter(format="$0.00")
p.xaxis[0].formatter = DatetimeTickFormatter(months="%b %Y")

# 显示结果
show(p)

通过以上代码,你可以创建一个x轴为日期时间的图表,并将日期格式化为 "月 年" 格式,如 "Jan 2021"。y轴的刻度格式化为美元金额。

相关链接

详细了解如何自定义坐标轴,请参阅用户指南中的 Styling axes

参考指南中的Axis

则包含了你可以用来自定义绘图坐标轴的所有可用属性列表。

相关推荐
NEIL_XU_7 分钟前
jenkins流水线+k8s部署springcloud微服务架构项目
服务器·spring cloud·架构·kubernetes·jenkins
Ty_110610 分钟前
Netty权威指南:Netty总结-Netty线程模型与架构剖析
服务器·网络·架构
计算机学姐15 分钟前
基于python+django+vue+MySQL的酒店推荐系统
开发语言·vue.js·后端·python·mysql·django·pip
夜雪一千22 分钟前
python使用xpath获取html中的所有链接
开发语言·python·html
2301_7969821424 分钟前
requests-html的详细使用方法
前端·python·html
人生三醒七分醉29 分钟前
pyspark 安装记录
python
筑天兄34 分钟前
【Lua学习】Lua入门
学习·junit·lua
iFulling36 分钟前
【Linux实践】实验二:LINUX操作基础
linux·运维·服务器
GoppViper39 分钟前
golang学习笔记17——golang使用go-kit框架搭建微服务详解
笔记·后端·学习·微服务·golang·编程语言·go-kit
爆更小小刘1 小时前
Python基础语法(1)上
开发语言·python