Python Bokeh库详解:交互式数据可视化
概要
数据可视化在数据分析和科学研究中起着至关重要的作用。而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可以轻松绘制地理图,展示数据在地图上的分布情况。通过使用TileSource
和Patches
,可以实现绘制各种地理形状,例如国家、州、城市等。
以下是一个简单的绘制世界地图的示例:
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可以绘制网络图,展示节点和边之间的关系。通过使用Nodes
和Edges
,可以创建具有复杂结构的网络图。
以下是一个简单的网络图的示例:
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的多样化功能使其成为解决不同可视化问题的理想选择,为用户提供了更丰富、更灵活的数据探索和展示手段。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!