Python中2种常用数据可视化库:Bokeh和Altair

ops/2024/9/18 12:09:05/ 标签: 信息可视化, 数据分析, 数据挖掘

本文分享自华为云社区《探究数据可视化:Bokeh vs. Altair》,作者:柠檬味拥抱。

在数据科学和数据分析领域,数据可视化是一种强大的工具,可以帮助我们更好地理解数据、发现模式和趋势。Python作为一种流行的数据科学工具,拥有多种数据可视化库。本文将重点比较Bokeh和Altair这两个常用的Python数据可视化库,探讨它们的优缺点以及在不同场景下的适用性。

Bokeh 简介

Bokeh是一个交互式可视化库,它能够创建各种类型的交互式图表,包括散点图、线图、条形图等。Bokeh提供了丰富的工具,使用户能够在图表中进行缩放、平移和选择等操作。

Altair 简介

Altair是一个基于Vega和Vega-Lite的声明式统计可视化库。它的设计理念是简单性和一致性,使用者只需通过简单的Python语法即可创建复杂的可视化图表,而无需深入了解底层的绘图细节。

Bokeh 与 Altair 的比较

  1. 易用性

    • Bokeh:相对而言,Bokeh的学习曲线较为陡峭,需要一定的时间来掌握其强大的交互功能和绘图选项。
    • Altair:Altair的语法相对简单直观,使用者可以更快速地创建出漂亮的图表,对于新手来说更易上手。
  2. 交互性

    • Bokeh:Bokeh提供了丰富的交互工具,可以轻松地创建交互式图表,并且支持自定义交互行为。
    • Altair:虽然Altair的交互功能相对较少,但是它可以无缝地与其他交互库(如Panel)集成,实现更复杂的交互需求。
  3. 可视化表达能力

    • Bokeh:Bokeh可以创建各种类型的图表,并且支持自定义图表的外观和布局。
    • Altair:Altair的语法设计简洁而灵活,可以轻松地实现复杂的可视化表达,例如使用facet进行分面绘图、使用layer进行图层叠加等。

示例代码和解析

Bokeh 示例:
from bokeh.plotting import figure, show
from bokeh.sampledata.iris import flowers# 创建一个散点图
p = figure(title="Iris Dataset", x_axis_label='Petal Length', y_axis_label='Petal Width')# 添加散点数据
p.circle(flowers['petal_length'], flowers['petal_width'], legend_label='Iris Flowers', color='blue', size=8)# 显示图表
show(p)

解析:

  • 使用Bokeh创建一个散点图,x轴为花瓣长度,y轴为花瓣宽度。
  • 使用Bokeh的circle方法添加散点数据,并指定图例标签、颜色和大小。
  • 最后调用show函数显示图表。
Altair 示例:
import altair as alt
from vega_datasets import data# 加载数据集
iris = data.iris()# 创建散点图
scatter = alt.Chart(iris).mark_circle().encode(x='petalLength:Q',y='petalWidth:Q',color='species:N',tooltip=['species', 'petalLength', 'petalWidth']
).properties(title='Iris Dataset',width=400,height=300
).interactive()# 显示图表
scatter

解析:

  • 使用Altair创建一个散点图,x轴为花瓣长度,y轴为花瓣宽度,颜色根据鸢尾花的种类进行编码。
  • 使用Altair的mark_circle方法创建散点图,并指定x、y、color等属性。
  • 最后通过.properties方法设置图表标题、宽度和高度,并调用.interactive()方法使图表具有交互功能。

通过以上示例和比较,我们可以看出,Bokeh和Altair都是功能强大的Python可视化库,它们各有优劣,选择合适的库取决于具体的需求和个人偏好。Bokeh适用于需要复杂交互的场景,而Altair则更适合于快速创建漂亮的可视化图表。

案例与代码示例

1. Bokeh 案例:

假设我们有一组销售数据,包括产品名称、销售量和销售额,我们想要使用 Bokeh 创建一个交互式条形图来展示各产品的销售情况。

from bokeh.plotting import figure, output_file, show
from bokeh.models import ColumnDataSource, HoverTool
from bokeh.transform import factor_cmap
import pandas as pd# 创建示例销售数据
sales_data = {'Product': ['Product A', 'Product B', 'Product C', 'Product D'],'Sales Volume': [100, 150, 200, 120],'Revenue': [5000, 7500, 10000, 6000]
}df = pd.DataFrame(sales_data)# 设置输出文件
output_file("sales_bar_chart.html")# 创建ColumnDataSource
source = ColumnDataSource(df)# 创建绘图对象
p = figure(x_range=df['Product'], plot_height=350, title="Sales Summary",toolbar_location=None, tools="")# 添加条形图
p.vbar(x='Product', top='Sales Volume', width=0.9, source=source,line_color='white', fill_color=factor_cmap('Product', palette='Set1', factors=df['Product']))# 添加悬停工具
p.add_tools(HoverTool(tooltips=[("Product", "@Product"), ("Sales Volume", "@{Sales Volume}"), ("Revenue", "@Revenue")]))# 设置图表属性
p.xgrid.grid_line_color = None
p.y_range.start = 0
p.yaxis.axis_label = "Sales Volume"# 显示图表
show(p)

这段代码是用于创建一个简单的条形图来展示销售数据,并使用 Bokeh 库进行可视化。以下是代码的主要步骤解析:

  1. 导入必要的库:

    • from bokeh.plotting import figure, output_file, show: 从 Bokeh 库中导入创建绘图、输出文件和显示图表的函数。
    • from bokeh.models import ColumnDataSource, HoverTool: 从 Bokeh 库中导入用于处理数据源和悬停工具的相关类。
    • from bokeh.transform import factor_cmap: 从 Bokeh 库中导入用于颜色映射的转换函数。
    • import pandas as pd: 导入 Pandas 库,用于处理数据。
  2. 创建示例销售数据:

    • 使用字典形式创建了示例的销售数据,包括产品名称、销售量和收入。
  3. 将数据转换为 Pandas DataFrame:

    • 使用 pd.DataFrame() 函数将销售数据转换为 DataFrame。
  4. 设置输出文件:

    • 使用 output_file() 函数设置输出文件名为 “sales_bar_chart.html”。
  5. 创建 ColumnDataSource:

    • 使用 ColumnDataSource 类将 DataFrame 转换为 Bokeh 可用的数据源。
  6. 创建绘图对象:

    • 使用 figure() 函数创建一个条形图对象 p,指定了 x 轴的范围、绘图高度、标题等属性。
  7. 添加条形图:

    • 使用 vbar() 方法向绘图对象添加条形图,指定了 x 值(产品名称)、条形的高度(销售量)、线条颜色、填充颜色等属性。
  8. 添加悬停工具:

    • 使用 add_tools() 方法向绘图对象添加悬停工具,指定了悬停时显示的信息,包括产品名称、销售量和收入。
  9. 设置图表属性:

    • 使用一系列属性设置函数设置图表的外观属性,如去除 x 轴的网格线、设置 y 轴起始值、设置 y 轴标签等。
  10. 显示图表:

    • 使用 show() 函数显示绘图对象。

通过这些步骤,代码创建了一个包含销售数据的条形图,并通过悬停工具提供了额外的交互信息。

image-20240314225214455

2. Altair 案例:

假设我们有一组学生的成绩数据,包括学生姓名、数学成绩和英语成绩,我们想要使用 Altair 创建一个散点图来展示学生的数学成绩与英语成绩的关系。

import altair as alt
import pandas as pd# 创建示例成绩数据
score_data = {'Student': ['Alice', 'Bob', 'Charlie', 'David', 'Emma'],'Math Score': [85, 90, 75, 80, 95],'English Score': [75, 85, 80, 70, 90]
}df = pd.DataFrame(score_data)# 创建散点图
scatter_plot = alt.Chart(df).mark_point().encode(x='Math Score',y='English Score',tooltip=['Student', 'Math Score', 'English Score']
).properties(title='Math vs English Scores',width=400,height=300
).interactive()# 显示图表
scatter_plot

这些示例代码展示了如何使用 Bokeh 和 Altair 分别创建交互式条形图和散点图,以展示销售数据和成绩数据的可视化。通过这些示例,可以更好地理解 Bokeh 和 Altair 在实际应用中的使用方法和效果。

3. Bokeh 案例(交互式地图):

假设我们有一组城市的经纬度数据,以及每个城市的人口数量,我们希望使用 Bokeh 创建一个交互式地图,显示每个城市的位置并以圆的大小表示人口数量。

from bokeh.plotting import figure, output_file, show
from bokeh.models import ColumnDataSource, HoverTool# 示例城市数据
cities_data = {'City': ['New York', 'Los Angeles', 'Chicago', 'Houston'],'Latitude': [40.7128, 34.0522, 41.8781, 29.7604],'Longitude': [-74.0060, -118.2437, -87.6298, -95.3698],'Population': [8399000, 3990456, 2705994, 2320268]
}df = pd.DataFrame(cities_data)# 设置输出文件
output_file("population_map.html")# 创建ColumnDataSource
source = ColumnDataSource(df)# 创建绘图对象
p = figure(plot_width=800, plot_height=600, title="Population Map",toolbar_location="below")# 添加圆形标记
p.circle(x='Longitude', y='Latitude', size='Population' / 100000,fill_alpha=0.6, line_color=None, source=source)# 添加悬停工具
hover = HoverTool()
hover.tooltips = [("City", "@City"), ("Population", "@Population")]
p.add_tools(hover)# 设置图表属性
p.xaxis.axis_label = "Longitude"
p.yaxis.axis_label = "Latitude"# 显示图表
show(p)
4. Altair 案例(堆叠柱状图):

假设我们有一组月度销售数据,包括销售额和利润,我们希望使用 Altair 创建一个堆叠柱状图,展示每个月的销售额和利润情况。

import altair as alt
import pandas as pd# 示例销售数据
sales_data = {'Month': ['Jan', 'Feb', 'Mar', 'Apr', 'May'],'Sales': [50000, 60000, 70000, 55000, 65000],'Profit': [20000, 25000, 30000, 22000, 27000]
}df = pd.DataFrame(sales_data)# 创建堆叠柱状图
stacked_bar_chart = alt.Chart(df).mark_bar().encode(x='Month',y='Sales',color=alt.value('blue'),tooltip=['Month', 'Sales']
).properties(title='Monthly Sales and Profit',width=400,height=300
).interactive() + \
alt.Chart(df).mark_bar().encode(x='Month',y='Profit',color=alt.value('orange'),tooltip=['Month', 'Profit']
)# 显示图表
stacked_bar_chart

这些示例代码展示了如何使用 Bokeh 和 Altair 分别创建交互式地图和堆叠柱状图,以展示城市人口分布和销售数据的可视化。这些示例为使用 Bokeh 和 Altair 进行数据可视化提供了更多的灵感和实践经验。

总结

本文对Python中两个常用的数据可视化库 Bokeh 和 Altair 进行了比较和探讨。通过对它们的特点、优缺点以及使用示例的详细分析,读者可以更好地了解这两个库的功能和适用场景,从而更好地选择合适的库来进行数据可视化工作。

在比较中,我们发现:

  • Bokeh 提供了丰富的交互功能和自定义选项,适用于需要复杂交互和自定义图表外观的场景,但学习曲线较陡。
  • Altair 的语法简洁直观,易于上手,适用于快速创建漂亮的可视化图表,但交互功能相对较少。

针对不同的需求和技能水平,读者可以灵活选择使用 Bokeh 或 Altair 进行数据可视化。Bokeh 适用于需要复杂交互和自定义外观的场景,而 Altair 则更适合快速创建漂亮的可视化图表。

通过本文的介绍和示例代码,读者可以进一步掌握 Bokeh 和 Altair 的使用方法,并在实践中运用它们来进行数据可视化工作。同时,我们也展望了数据可视化领域未来的发展趋势,包括增强交互性、提升性能和效率、整合机器学习和深度学习等方面。

总之,数据可视化作为数据科学和数据分析领域的重要工具,将在未来继续发挥重要作用。Bokeh 和 Altair 等可视化库的不断发展和完善,将为用户提供更加强大和便捷的数据可视化工具,助力数据分析和决策支持工作的开展。


http://www.ppmy.cn/ops/11574.html

相关文章

4-19 算法思路总结

leetcode 98 验证二叉搜索树 利用递归算法,从上而下递归,遇到false直接返回无需递归到叶子节点,从上往下递归时,传递并改变两个参数,对于当前节点的最大值以及最小值,对于根节点来说,初始化的最…

服务器硬件及RAID配置实战

服务器硬件详解 RAID磁盘阵列详解 阵列卡介绍与真机配置 构建软RAID磁盘阵列 服务器介绍 服务器 分类 机架式居多 塔式 刀片式 机柜式 架构 X86 ARM 品牌 戴尔 AMD 英特尔 惠普 华为 华三H3C 联想 浪潮 长城 规格 1C1G …

Docker容器的原理及应用详解(一)

本系列文章简介: Docker是一种开源的容器化技术,它将应用程序及其依赖项打包为一个容器,以便在任何环境下运行。与传统的虚拟机相比,Docker容器更加轻量级且快速,可以在几秒钟内启动和停止。Docker的原理和应用非常广泛,可以用于开发、测试、部署和扩展应用程序。 在传统…

Windows系统 清除本地maven仓库无用的 _remote.repositories、sha1、lastUpdated相关的文件

Windows系统 清除本地maven仓库无用的 _remote.repositories、sha1、lastUpdated相关的文件 脚本命令: set REPOSITORY_PATH 你自己本地maven仓库地址 rem starting... for /f "delims" %%i in (dir /b /s "%REPOSITORY_PATH%\*_remote.repositori…

服务器 BMC(基板管理控制器,Baseboard Management Controller)认知

写在前面 工作中遇到,简单整理博文内容涉及 BMC 基本认知理解不足小伙伴帮忙指正 不必太纠结于当下,也不必太忧虑未来,当你经历过一些事情的时候,眼前的风景已经和从前不一样了。——村上春树 基板管理控制器(BMC&…

java使用Sokcet和ServerSocket类实现tcp通信

TCP通信: 面向连接,可靠通信 创建客户端程序,使用Socket类 Socket: public Socket(String host, int port) Creates a stream socket and connects it to the specified port number on the named host. 根据指定的服务器ip,…

【LeetCode热题100】【二分查找】搜索旋转排序数组

题目链接:33. 搜索旋转排序数组 - 力扣(LeetCode) 同样是要在数组中查找元素,不同的是这次的数组是这样//的,升序数组,但是往前移动了一下,也就是两段升序,456123这样 看了一位天才…

电机控制专题(一)——最大转矩电流比MTPA控制

文章目录 电机控制专题(一)——最大转矩电流比MTPA控制前言理论推导仿真验证轻载1Nm重载30Nm 总结 电机控制专题(一)——最大转矩电流比MTPA控制 前言 MTPA全称为Max Torque Per Ampere,从字面意思就可以知道MTPA算法的目的是一个寻优最值问题,可以从以…

Docker 部署 MongoDB 数据库

文章目录 官网地址docker 网络mongod.conf部署 MongoDB部署 mongo-expressdocker-compose.ymlMongoDB shell 官网地址 https://www.mongodb.com/zh-cn docker 网络 # 创建 mongo_network 网络 docker network create mongo_network # 查看网络 docker network list # 容器连…

liqo学习及安装,k8s,kubernetes多集群互联

先按照官方的教程在虚拟机安装学习 在开始以下教程之前,您应该确保您的系统上安装了以下软件: Docker,容器运行时。Kubectl,Kubernetes 的命令行工具。 curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.…

第九章 更复杂的光照

Unity的渲染路径 渲染路径决定了光照是如何应用到Unity Shader中的,需要为每个Pass指定它的渲染路径。 完成上面的设置后,我们可以在每个Pass中使用标签来指定该Pass使用的渲染路径。 指定渲染路径是我们和Unity的底层渲染引擎的一次重要的沟通。 前向渲染路径 前向渲染路…

光学雨量计:高精度测量降水量的理想解决方案

光学雨量计:高精度测量降水量的理想解决方案 河北稳控科技光学雨量计是一种高精度测量降水量的理想解决方案。它利用光学原理,通过光束的衰减来测量降雨强度和累积降水量。相比传统的雨量计,光学雨量计具有更高的精度和可靠性,成…

Python的venv虚拟环境

venv 是 Python 的一个内置模块,用于创建和管理虚拟环境(virtual environments)。虚拟环境可以独立于系统的全局环境,并且可以在其中安装特定版本的包和库,以便于项目之间的隔离和管理。下面是 venv 的使用教程&#x…

比特币中的符文是什么?

比特币中的符文是什么? 比特币符文是存在于比特币区块链上的独特的、可替代的代币。它们旨在代表具有独特特征和元数据的可替代资产。 Ordinals 协议的创建者 Casey Rodamor 最近放弃了一项替代 BRC-20 可替代代币协议的提案,该替代方案被称为 Runes。 破…

git常见命令(成长版)

ps:所谓成长版就是后续可能还会添加命令: 1.删除本地分支: git branch -d 分支名 2.拉取代码后默认master分支,切换到线上其他分支: (1)查看线上所有分支: git branch -a &#…

深入理解Git命令:Merge与Rebase的使用场景和注意事项

深入理解Git命令:Merge与Rebase的使用场景和注意事项 在Git版本控制中,Merge和Rebase是常用的两种操作,用于将不同分支的代码整合到一起。虽然它们的目的相同,但实现方式和影响提交历史的方式有所不同。本文将结合具体示例详细介…

基于SpringBoot的“人职匹配推荐系统”的设计与实现(源码+数据库+文档+PPT)_2024-04-1

基于SpringBoot的“人职匹配推荐系统”的设计与实现(源码数据库文档PPT) 开发语言:Java 数据库:MySQL 技术:SpringBoot 工具:IDEA/Ecilpse、Navicat、Maven 系统展示 系统功能结构图 应聘信息管理界面图 应聘状况…

鸿蒙画布组件使用介绍

一、前言 DevEco Studio版本:4.0.0.600 前些天写了一篇 鸿蒙自定义控件实现罗盘数字时钟效果 的文章,有同学私信说能不能介绍鸿蒙中的画布组件,下面文章介绍下鸿蒙中的Canvas画布、CanvasRenderingContext2D绘制组件,实现绘制文…

[ LeetCode ] 题刷刷(Python)-第20题:有效的括号

题目描述 给定一个只包括 (,),{,},[,] 的字符串 s ,判断字符串是否有效。 有效字符串需满足: 1、左括号必须用相同类型的右括号闭合。 2、左括号必须以正确的顺序闭合。 3、每个右括号都有一个对…

上海计算机学会2022年11月月赛C++丙组T3最长平台

题目描述 给定一个整数数列 a1​,a2​,…,an​,请找出最长平台。所谓平台,就是指数列中一段连续的、完全相等的数字,单个数字也可以成为一个平台。最长平台可能不止一个,在找到最长平台的同时,输出最长平台的数量。 …