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

更多资料获取

📚 个人网站:ipengtao.com


数据可视化在数据分析和科学研究中起着至关重要的作用。而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 FunctionHandlerdef 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的多样化功能使其成为解决不同可视化问题的理想选择,为用户提供了更丰富、更灵活的数据探索和展示手段。


Python学习路线

在这里插入图片描述

更多资料获取

📚 个人网站:ipengtao.com

如果还想要领取更多更丰富的资料,可以点击文章下方名片,回复【优质资料】,即可获取 全方位学习资料包。

在这里插入图片描述
点击文章下方链接卡片,回复【优质资料】,可直接领取资料大礼包。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/217149.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

西工大网络空间安全学院计算机系统基础实验二(phase_3,phase_4,phase_5)

大家千万不要着急,不要慌张,即使自己并不了解多少汇编代码的知识,即使自己计基课上的基础知识学的并不扎实,也都不要紧,因为这次计基实验考察的重点并不是基础知识,而是对gdb工具的掌握,以及心细…

基于.NET Core + Quartz.NET+ Vue + IView开箱即用的定时任务UI

前言 定时任务调度应该是平时业务开发中比较常见的需求,比如说微信文章定时发布、定时更新某一个业务状态、定时删除一些冗余数据等等。今天给大家推荐一个基于.NET Core Quartz.NET Vue IView开箱即用的定时任务UI(不依赖数据库,只需在界面做简单配…

Spring Boot学习随笔- 集成JSP模板(配置视图解析器)、整合Mybatis(@MapperScan注解的使用)

学习视频&#xff1a;【编程不良人】2021年SpringBoot最新最全教程 第五章、JSP模板集成 5.1 引入JSP依赖 <!--引入jsp解析依赖--> <!--C标签库--> <dependency><groupId>jstl</groupId><artifactId>jstl</artifactId><version&…

第二十一章网络通信

网络程序设计基础 局域网与互联网 为了实现两台计算机的通信&#xff0c;必须用一个网络线路连接两台计算机。如下图所示 网络协议 1.IP协议 IP是Internet Protocol的简称&#xff0c;是一种网络协议。Internet 网络采用的协议是TCP/IP协议&#xff0c;其全称是Transmissio…

人工智能应用专栏----专栏介绍

文章目录 本专栏主要记录人工智能的应用方面的内容&#xff0c;包括chatGPT、AI绘图等等&#xff1b; 订阅后可私聊我获取 《从零注册并登录使用ChatGPT》 《从零开始使用chatGPT的API&#xff1b;通过chatgpt-next-web部署自己chatGPT web网页&#xff1b;无需翻墙&#xff0c…

求矩阵各行元素之和

本题要求编写程序&#xff0c;求一个给定的mn矩阵各行元素之和。 输入格式&#xff1a; 输入第一行给出两个正整数m和n&#xff08;1≤m,n≤6&#xff09;。随后m行&#xff0c;每行给出n个整数&#xff0c;其间 以空格分隔。 输出格式&#xff1a; 每行输出对应矩阵行元素…

java系列-LinkedHashMap

1.插入新节点时&#xff0c;会将该节点加到链表尾部 public class LinkedHashMap<K,V> extends HashMap<K,V> implements Map<K,V>{/*** The head (eldest) of the doubly linked list.*/transient LinkedHashMapEntry<K,V> head;/*** The tail (young…

【小红书运营指南2】小红书自律标签的达人分解

小红书标签的达人分解 写在最前面11.27初步想法达人分析 标签拆解&#xff08;速览版&#xff09;分析应用 思路 相关标签拆解&#xff08;详细版&#xff09;11、职场-职场干货 文化薯&#xff08;创业&#xff0c;也是专注知识付费&#xff0c;可以对标学习&#xff09;笔记画…

用modelbox server启动流程图,暴露Restful接口

背景 假设你已经搭建了modelbox开发容器&#xff0c;能够使用webUI构建流程图。如果没有请参考昇腾npu上构建modelbox webUI开发容器教程。 现在&#xff0c;本文会说明&#xff0c;如何在终端用命令的方式将流程图暴露为服务&#xff0c;并能够在本地用postman访问。 本文参…

华为OD机试三(完全二叉树部分后续遍历、猜密码、五子棋谜)

1. 完全二叉树部分后续遍历 题目表述&#xff1a;输入&#xff1a; 1 2 3 4 5 6 7 输出&#xff1a; 2 3 1 示例代码&#xff1a; # 测试数据 test_data [1,2,3,4,5,6,7] # 找出非叶子节点 new_list [] for i in test_data:left 2 * iright left 1if left in test_data…

codeforces D - Trees and Segments

思路 因为涉及到 l 0 l_0 l0​ 最大连续长度和 l 1 l_1 l1​ 最大连续长度&#xff0c;考虑枚举 l 1 l_1 l1​ 的长度 d p l 0 dp\;l_0 dpl0​ 的长度。 m a x 0 p r e f [ i ] [ c n t ] max0pref[i][cnt] max0pref[i][cnt] 表示以 i − 1 i-1 i−1 结尾的 l 0 l_0 l0​…

使用 Webshell 访问 SQL Server 主机并利用 SSRS

RDS SQL Server提供Webshell功能&#xff0c;用户可以通过Web界面登录RDS SQL Server 实例的操作系统。通过Webshell&#xff0c;用户可以在RDS SQL Server实例上执行命令、上传和下载文件以及执行各种操作。Webshell 提供了一种方便高效的远程管理方法&#xff0c;尤其是在 SS…

如何使用nacos进行配置管理以及代码集成

首先需要在maven的pom文件中引入nacos-config依赖 <!--nacos配置管理依赖--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId></dependency> 在项目中添加boo…

Python 全栈体系【四阶】(四)

第四章 机器学习 一、人工智能概述 1. 什么是人工智能 人工智能&#xff08;Artificial Intelligence&#xff09;是计算机科学的一个分支学科&#xff0c;主要研究用计算机模拟人的思考方式和行为方式&#xff0c;从而在某些领域代替人进行工作。 2. 人工智能的学科体系 …

输出网络结构图,mmdetection

控制台输入&#xff1a;python tools/train.py /home/yuan3080/桌面/detection_paper_6/mmdetection-master1/mmdetection-master_yanhuo/work_dirs/lad_r50_paa_r101_fpn_coco_1x/lad_r50_a_r101_fpn_coco_1x.py 这个是输出方法里面的&#xff0c;不是原始方法。 如下所示&a…

分层自动化测试的实战思考!

自动化测试的分层模型 自动化测试的分层模型&#xff0c;我们应该已经很熟悉了&#xff0c;按照分层测试理念&#xff0c;自动化测试的投入产出应该是一个金字塔模型。越是向下&#xff0c;投入/产出比就越高&#xff0c;但开展的难易程度/成本和技术要求就越高&#xff0c;但…

附录C 流水线:基础与中级概念

1. 引言 1.1 什么是流水线&#xff1f; 流水线爱是一种将多条指令重叠执行的实现技术&#xff0c;它利用了一条指令所需的多个操作之间的并行性。&#xff08;指令操作的非原子性和指令类型的多样性&#xff09; 在计算流水线中&#xff0c;每个步骤完成指令的一部分&#x…

Leetcode143 重排链表

重排链表 题解1 线性表 给定一个单链表 L 的头节点 head &#xff0c;单链表 L 表示为&#xff1a; L0 → L1 → … → Ln - 1 → Ln请将其重新排列后变为&#xff1a; L0 → Ln → L1 → Ln - 1 → L2 → Ln - 2 → …不能只是单纯的改变节点内部的值&#xff0c;而是需要实际…

知识笔记(四十七)———什么是mysql

MySQL是一个开源的关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;它使用SQL&#xff08;结构化查询语言&#xff09;作为操作和管理数据的语言。MySQL广泛应用于各种应用程序和网站中&#xff0c;是最受欢迎的开源数据库之一。 以下是MySQL的一些主要特点和功…

mumu模拟器,adb devices 忽然就不显示设备解决方法

依次执行以下 adb kill-server adb start-server adb devices