Python Bokeh库详解:交互式数据可视化

2023-12-26 12:42:25


概要

数据可视化在数据分析和科学研究中起着至关重要的作用。而Bokeh(发音为“bo-kay”)是一个强大的Python交互式可视化库,提供了丰富的工具和功能,使得创建交互式、吸引人的数据可视化变得轻而易举。本文将深入介绍Bokeh库的各个方面,通过丰富的示例代码,帮助读者更全面地了解和使用这一强大的工具。


安装与基础绘图

首先,需要安装Bokeh库。通过以下命令即可完成安装:

pip?install?bokeh

安装完成后,可以开始学习Bokeh的基础绘图。

以下是一个简单的例子,绘制一条折线图:

from?bokeh.plotting?import?figure,?show

#?创建一个绘图对象
p?=?figure(title="简单折线图",?x_axis_label="X轴",?y_axis_label="Y轴")

#?添加折线
p.line([1,?2,?3,?4,?5],?[6,?7,?2,?4,?3])

#?显示绘图
show(p)

数据源与图形配置

Bokeh支持多种数据源和丰富的图形配置选项。

以下是一个使用ColumnDataSource的例子,同时配置图形属性的示例:

from?bokeh.models?import?ColumnDataSource

#?数据源
source?=?ColumnDataSource(data=dict(x=[1,?2,?3,?4,?5],?y=[6,?7,?2,?4,?3]))

#?创建绘图对象
p?=?figure(title="数据源与图形配置",?x_axis_label="X轴",?y_axis_label="Y轴")

#?添加折线
p.line('x',?'y',?source=source,?line_width=2,?line_color="green",?legend_label="折线")

#?显示图形
show(p)

图形交互与工具

Bokeh的强大之处在于其交互性和丰富的工具集。

以下示例展示了如何添加轨迹选择工具、缩放工具等:

from?bokeh.models?import?HoverTool

#?创建绘图对象
p?=?figure(title="图形交互与工具",?x_axis_label="X轴",?y_axis_label="Y轴",?tools="pan,box_zoom,reset")

#?添加折线
p.line([1,?2,?3,?4,?5],?[6,?7,?2,?4,?3],?line_width=2,?line_color="blue",?legend_label="折线")

#?添加hover工具
hover?=?HoverTool()
hover.tooltips?=?[("数值",?"@x,?@y")]
p.add_tools(hover)

#?显示图形
show(p)

布局与多图绘制

Bokeh支持灵活的布局,可以轻松组合多个图形。

以下是一个简单的例子,展示了如何创建水平布局:

from?bokeh.layouts?import?row

#?创建两个绘图对象
p1?=?figure(title="图1",?x_axis_label="X轴",?y_axis_label="Y轴")
p2?=?figure(title="图2",?x_axis_label="X轴",?y_axis_label="Y轴")

#?添加折线
p1.line([1,?2,?3,?4,?5],?[6,?7,?2,?4,?3],?line_width=2,?line_color="red",?legend_label="折线1")
p2.line([1,?2,?3,?4,?5],?[3,?2,?7,?1,?6],?line_width=2,?line_color="green",?legend_label="折线2")

#?将两个图形水平排列
layout?=?row(p1,?p2)

#?显示布局
show(layout)

其他高级功能

Bokeh库不仅提供了基础的绘图功能,还支持许多高级功能,拓展了其应用领域。以下是一些Bokeh的高级功能:

1 绘制地理图

Bokeh可以轻松绘制地理图,展示数据在地图上的分布情况。通过使用TileSourcePatches,可以实现绘制各种地理形状,例如国家、州、城市等。

以下是一个简单的绘制世界地图的示例:

from?bokeh.plotting?import?figure,?show
from?bokeh.tile_providers?import?get_provider
from?bokeh.models?import?ColumnDataSource

#?创建绘图对象
p?=?figure(title="世界地图",?x_axis_label="经度",?y_axis_label="纬度",?plot_height=400,?plot_width=800)

#?设置TileSource为OpenStreetMap
tile_source?=?get_provider('OSM')
p.add_tile(tile_source)

#?示例数据,表示两个城市的坐标
cities_data?=?dict(
????lon=[-74.0059,?139.6917],
????lat=[40.7128,?35.6895],
????name=['New?York',?'Tokyo']
)

#?将数据转为ColumnDataSource
cities_source?=?ColumnDataSource(cities_data)

#?绘制城市点
p.circle(x='lon',?y='lat',?size=10,?color='red',?alpha=0.8,?legend_label='Cities',?source=cities_source)

#?显示地理图
show(p)

2 时间序列图

Bokeh支持绘制时间序列图,展示数据随时间的变化。通过设置X轴为时间类型,可以轻松绘制时间序列。

以下是一个简单的股票价格时间序列图的示例:

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

#?示例数据,表示股票价格随时间的变化
stock_data?=?dict(
????date=[datetime(2022,?1,?1),?datetime(2022,?1,?2),?datetime(2022,?1,?3)],
????price=[100,?120,?90]
)

#?将数据转为ColumnDataSource
stock_source?=?ColumnDataSource(stock_data)

#?创建绘图对象
p?=?figure(title="股票价格时间序列",?x_axis_label="日期",?y_axis_label="股价",?x_axis_type="datetime")

#?绘制线条
p.line(x='date',?y='price',?line_width=2,?line_color='blue',?source=stock_source)

#?显示时间序列图
show(p)

3 网络图

Bokeh可以绘制网络图,展示节点和边之间的关系。通过使用NodesEdges,可以创建具有复杂结构的网络图。

以下是一个简单的网络图的示例:

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

#?示例数据,表示网络中的节点和边
network_data?=?dict(
????nodes=[1,?2,?3,?4],
????edges=[(1,?2),?(2,?3),?(3,?4),?(4,?1)]
)

#?将数据转为ColumnDataSource
network_source?=?ColumnDataSource(network_data)

#?创建绘图对象
p?=?figure(title="网络图",?x_axis_label="X轴",?y_axis_label="Y轴")

#?绘制节点和边
p.circle('x',?'y',?size=20,?color='blue',?source=network_source,?legend_label='Nodes')
p.multi_line('edge_x',?'edge_y',?line_width=2,?line_color='green',?source=network_source,?legend_label='Edges')

#?添加节点和边的链接
p.add_layout(NodesAndLinkedEdges(node_source=network_source,?edge_source=network_source))

#?显示网络图
show(p)

实时数据更新与动画

Bokeh还支持实时数据更新和动画效果,使得数据可视化更生动。

以下是一个简单的实时数据更新的示例:

from?bokeh.models?import?ColumnDataSource
from?bokeh.io?import?curdoc
import?numpy?as?np
import?time

#?数据源
source?=?ColumnDataSource(data=dict(x=[0],?y=[0]))

#?创建绘图对象
p?=?figure(title="实时数据更新",?x_axis_label="X轴",?y_axis_label="Y轴")

#?添加实时数据点
p.circle('x',?'y',?source=source,?size=10,?line_color="navy",?fill_color="orange",?alpha=0.6)

#?实时更新数据
def?update_data():
????new_data?=?dict(x=[source.data['x'][-1]?+?1],?y=[np.random.randint(0,?10)])
????source.stream(new_data,?rollover=20)
????time.sleep(0.5)??#?模拟实时更新

#?添加周期性回调,实现实时更新
curdoc().add_periodic_callback(update_data,?1000)

#?显示实时数据更新图形
show(p,?notebook_handle=True)

导出与嵌入

Bokeh允许用户将绘图导出为HTML、PNG、SVG等格式,方便在不同环境中分享和展示。

以下是一个将绘图导出为HTML文件的例子:

from?bokeh.io?import?output_file

#?创建绘图对象
p?=?figure(title="导出与嵌入",?x_axis_label="X轴",?y_axis_label="Y轴")
p.line([1,?2,?3,?4,?5],?[6,?7,?2,?4,?3],?line_width=2,?line_color="purple",?legend_label="折线")

#?导出为HTML文件
output_file("plot.html")

#?显示图形
show(p)

通过导出功能,用户可以将Bokeh图形轻松嵌入到网页中,与其他内容集成展示。

Bokeh Server

对于需要更高级交互性和动态更新的场景,Bokeh提供了Bokeh Server。

以下是一个简单的Bokeh Server示例:

from?bokeh.server.server?import?Server
from?bokeh.application?import?Application
from?bokeh.application.handlers.function?import?FunctionHandler

def?modify_doc(doc):
????#?在这里添加交互性和动态更新的代码
????pass

#?创建Bokeh?Server应用
bokeh_app?=?Application(FunctionHandler(modify_doc))

#?启动Bokeh?Server
server?=?Server({'/':?bokeh_app},?port=5000)
server.start()

if?__name__?==?'__main__':
????print('Visit?http://localhost:5006/?to?view?this?app')
????server.io_loop.add_callback(server.show,?"/")
????server.io_loop.start()

通过Bokeh Server,用户可以构建更复杂的交互式应用,实现更灵活的数据可视化。

总结

Bokeh库作为Python中的一款强大数据可视化工具,不仅提供了基础的绘图功能,还支持多种高级功能,拓展了其应用领域。本文深入介绍了Bokeh的基础绘图、数据源与图形配置、图形交互与工具、布局与多图绘制等基本功能,提供了全面的入门指南。此外,通过展示Bokeh在实时数据更新与动画、导出与嵌入、Bokeh Server以及其他高级功能方面的应用,可以深入了解Bokeh在复杂场景下的强大表现。

Bokeh的高级功能涵盖了绘制地理图、展示时间序列、绘制网络图等多个领域,使其不仅适用于常规数据可视化,也能满足特定领域的需求。例如,绘制世界地图可以展示数据在地理空间的分布,时间序列图可以清晰呈现数据随时间的变化趋势,而网络图则适用于展示节点和边之间的复杂关系。

总体而言,Bokeh以其简洁的语法、丰富的功能和强大的灵活性,成为数据科学和可视化领域的得力工具。通过本文的学习,能够更熟练地运用Bokeh库,创建出更具交互性和吸引力的数据可视化图形,提高数据分析和展示的效果。Bokeh的多样化功能使其成为解决不同可视化问题的理想选择,为用户提供了更丰富、更灵活的数据探索和展示手段。

文章来源:https://blog.csdn.net/Rocky006/article/details/135169164
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。