查看全课大纲(第 7 / 45 节)
- 1.课程简介
- 2.环境搭建
- 3.预备知识
- 4.pyecharts初体验
- 5.数据可视化概述
- 6.数据可视化的目标和作用
- 7.数据可视化工具对比分析
- 8.数据可视化基本流程
- 9.数据可视化设计原则
- 10.pyecharts简介
- 11.官方图表样例
- 12.常用图表的基本结构
- 13.数据格式
- 14.图表的分类
- 15.柱状图与条形图
- 16.其他对比图表
- 17.常用配置项(一)
- 18.常用配置项(二)
- 19.折线图 面积图
- 20.K线图
- 21.其他时间图表
- 22.常用配置项
- 23.散点图 气泡图
- 24.热力图
- 25.其他相关性图表
- 26.饼图
- 27.矩形树图
- 28.其他成分比例图表
- 29.箱型图与直方图
- 30.3D柱状图与折线图
- 31.其他统计图表
- 32.地图 Map
- 33.地理坐标系Geo
- 34.3D 地图
- 35.网络关系图
- 36.主题河流图
- 37.词云图
- 38.组合图表组件
- 39.仪表盘相关图表
- 40.项目介绍
- 41.数据准备
- 42.子图制作(一)
- 43.子图制作(二)
- 44.数据大屏制作
- 45.项目总结
数据可视化工具对比分析
Python 数据可视化工具对比分析
小象实战讲义 · ECharts 数据可视化
在掌握了 Python 和 pandas 数据分析基础后,如何将分析结果转化为直观、美观且可交互的 Web 图表,是迈向数据可视化应用的关键一步。本节将系统性地对比 Python 生态中五个主流可视化工具,帮助你根据项目需求,快速选择最合适的“画笔”,为后续深入学习 ECharts 打下坚实基础。
💡 核心导读
- 建立评估框架:从代码量、图表丰富度、数据兼容性、参考资料、交互性、定制难度和默认美观度七个维度,建立工具选型的量化标准。
- 横向对比五强:深入剖析 pyecharts、Matplotlib、Plotly、Bokeh 和 Seaborn 的核心特点、优势与短板。
- 明确选型策略:理解“可交互性”与“参考资料丰富度”是影响学习曲线和应用场景的关键因素,掌握“精通一个,了解其余”的高效学习路径。
- 聚焦课程核心:基于综合评估,明确本课程将重点讲解的 pyecharts 工具,及其在构建 Web 图表和数据大屏方面的独特优势。
一、评估指标:如何科学选择可视化工具?
面对众多工具,我们需要一个客观的评估体系。本节我们设定七个核心指标,对每个工具进行量化打分(满分100分),以便进行横向比较。
| 指标 | 权重 | 说明 |
|---|---|---|
| 代码量 | 10分 | 使用相同数据和图表类型,实现所需代码的简洁程度。 |
| 图表数量 | 20分 | 工具库原生支持的图表种类丰富度。 |
| 数据格式 | 10分 | 对 pandas 等常用数据结构的原生支持程度,是否需要额外转换。 |
| 参考资料 | 20分 | 官方文档、社区教程、讨论活跃度等学习资源的丰富程度。 |
| 交互性 | 10分 | 是否支持图表缩放、拖拽、悬停提示、数据筛选等交互操作。 |
| 调整复杂度 | 20分 | 对图表进行深度定制和样式调整的难易程度。 |
| 默认美观度 | 10分 | 在不做任何样式调整下,生成图表的视觉美观程度。 |
我们将使用一组统一的测试数据来评估各工具。这组数据模拟了不同品牌手机在两个不同场景(如年度或商场)下的销量对比。
import pandas as pd
# 定义测试数据:品牌手机在两个场景下的销量
data = {
'品牌': ['Apple', 'Huawei', 'Xiaomi', 'OPPO', 'Vivo'],
'销量_Y1': [120, 95, 80, 65, 50], # 场景一销量
'销量_Y2': [110, 105, 85, 70, 55] # 场景二销量
}
df_test = pd.DataFrame(data)
print(df_test)品牌 销量_Y1 销量_Y2
0 Apple 120 110
1 Huawei 95 105
2 Xiaomi 80 85
3 OPPO 65 70
4 Vivo 50 55接下来,我们将基于这组数据,从七个维度逐一审视五个主流工具。
二、工具深度剖析:五强逐鹿
1. pyecharts:面向 Web 的交互式可视化利器
综合得分:85分
pyecharts 是 Python 对百度开源可视化库 ECharts 的封装。它生成的图表可直接在 Web 浏览器中展示,并具备丰富的交互能力。
核心优势:
- 交互性与美观度:原生支持丰富的交互操作(缩放、拖拽、数据筛选、悬停提示),且默认主题现代、美观。
- 参考资料丰富:拥有详细的中文官方文档和大量在线示例,社区活跃,问题易于检索解决。
- 配置灵活:通过链式调用
opts配置项,可以相对直观地对图表进行深度定制(如主题、标记线、数据区域缩放等)。
主要短板:
数据格式:早期版本对 pandas DataFrame 的直接支持较弱,通常需要转换为 Python 列表 (
list) 使用。锁定版 pyecharts 2.1.0 仍不能把 pandas 的 Series 直接作为轴数据传入;请在绘图前显式调用.tolist()。
from pyecharts.charts import Bar
from pyecharts import options as opts
# 准备数据(将DataFrame列转换为列表)
x_data = df_test['品牌'].tolist()
y1_data = df_test['销量_Y1'].tolist()
y2_data = df_test['销量_Y2'].tolist()
# 创建基础柱状图
bar = (
Bar()
.add_xaxis(x_data)
.add_yaxis("场景一销量", y1_data)
.add_yaxis("场景二销量", y2_data)
.set_global_opts(
title_opts=opts.TitleOpts(title="手机品牌销量对比"),
toolbox_opts=opts.ToolboxOpts(), # 添加工具箱(可缩放、保存图片等)
)
)
# 打印图表类型和系列信息作为摘要
print(f"图表类型: {type(bar).__name__}")
print(f"X轴数据: {bar.options['xAxis'][0]['data']}")
print(f"系列数量: {len(bar.options['series'])}")
print(f"系列名称: {[s['name'] for s in bar.options['series']]}")图表类型: Bar
X轴数据: ['Apple', 'Huawei', 'Xiaomi', 'OPPO', 'Vivo']
系列数量: 2
系列名称: ['场景一销量', '场景二销量']2. Matplotlib:科学绘图的基石
综合得分:77分
Matplotlib 是 Python 最基础、应用最广泛的可视化库,堪称科学绘图领域的“标准答案”。
核心优势:
- 图表数量与参考资料:支持几乎所有类型的科学图表,拥有海量的教程、文档和社区问答,学习资源极其丰富。
- 高度可控:几乎可以控制图表的每一个像素,非常适合需要精密控制的学术论文、出版物图表制作。
主要短板:
- 交互性:默认生成静态图片,不支持网页端的交互操作。
- 默认美观度与中文支持:默认样式较为朴素,且需要额外配置才能正确显示中文。
- 代码量:实现复杂图表时,代码量通常较多。
import matplotlib.pyplot as plt
import matplotlib
# 设置中文字体(示例,具体路径需根据系统调整)
matplotlib.rcParams['font.sans-serif'] = ['SimHei']
matplotlib.rcParams['axes.unicode_minus'] = False
fig, ax = plt.subplots(figsize=(8, 5))
x = range(len(df_test))
width = 0.35
ax.bar([i - width/2 for i in x], df_test['销量_Y1'], width, label='场景一销量')
ax.bar([i + width/2 for i in x], df_test['销量_Y2'], width, label='场景二销量')
ax.set_xlabel('品牌')
ax.set_ylabel('销量')
ax.set_title('手机品牌销量对比 (Matplotlib)')
ax.set_xticks(x)
ax.set_xticklabels(df_test['品牌'])
ax.legend()
plt.tight_layout()
# 在讲义中,我们仅描述生成过程,不实际渲染图片
print("Matplotlib 静态对比柱状图已生成。")3. Plotly:强大的交互式与在线协作工具
综合得分:76分
Plotly 提供了一套强大的交互式图表库,支持在线编辑、分享和嵌入到 Web 应用中。
核心优势:
- 交互性与美观度:内置完整的交互能力(如缩放、平移、悬停详情、图例筛选),默认图表样式精美。
- 多样化输出:支持在线模式(上传至Plotly云端)和离线模式(生成本地HTML),便于集成与分享。
主要短板:
- 参考资料:官方文档为英文,国内社区教程相对较少,深度配置时需要较多自主探索。
4. Bokeh:为现代 Web 浏览器量身定制
综合得分:71分
Bokeh 专注于为 Web 浏览器生成高性能、可交互的可视化图表,其目标是提供 D3.js 风格的优雅交互,但使用难度更低。
核心优势:
- 交互性与 Web 集成:专为 Web 设计,交互流畅,可轻松嵌入 Flask、Django 等 Web 应用。
- 输出美观:生成的图表风格简洁现代。
主要短板:
- 数据格式与代码量:拥有自己特定的数据源对象(如
ColumnDataSource),需要将数据转换为其格式,导致数据处理部分的代码量增加。 - 参考资料:中文学习资料相对有限。
- 数据格式与代码量:拥有自己特定的数据源对象(如
5. Seaborn:基于 Matplotlib 的统计图形高级接口
综合得分:72分
Seaborn 是基于 Matplotlib 的二次封装,专注于统计可视化。它简化了许多复杂统计图表的创建过程。
核心优势:
- 代码量:用极简的代码(通常一两行)即可绘制出美观的统计图表(如分布图、回归图、热力图等)。
- 默认美观度:内置多种优雅的调色板和主题,默认输出比 Matplotlib 美观。
- 与 Pandas 集成好:与 pandas DataFrame 无缝衔接。
主要短板:
- 交互性:同 Matplotlib 一样,生成静态图表。
- 底层依赖:基于 Matplotlib,因此同样面临中文显示需要额外配置的问题。
- 图表类型:更侧重于统计图表,某些特定类型的商业图表可能不是其强项。
import seaborn as sns
import matplotlib.pyplot as plt
# 为演示,我们使用 Seaborn 绘制一个简单的统计图(需将数据转换为长格式)
df_long = df_test.melt(id_vars='品牌', var_name='场景', value_name='销量')
print("转换后的长格式数据(供Seaborn使用):")
print(df_long.head())转换后的长格式数据(供Seaborn使用):
品牌 场景 销量
0 Apple 销量_Y1 120
1 Huawei 销量_Y1 95
2 Xiaomi 销量_Y1 80
3 OPPO 销量_Y1 65
4 Vivo 销量_Y1 50三、总结与选型指南
综合以上分析,我们可以从两个最关键的因素——交互性和参考资料丰富度——来快速定位工具:
| 工具 | 可交互 | 参考资料丰富度 | 典型应用场景 |
|---|---|---|---|
| pyecharts | 有 | 多 (中文友好) | Web交互图表、数据报告、数据大屏 |
| Matplotlib | 无 | 多 (极其丰富) | 科研论文、出版级静态图表 |
| Plotly | 有 | 少 (英文为主) | 在线交互仪表盘、协作分析 |
| Bokeh | 有 | 少 (英文为主) | 高度定制化Web应用集成 |
| Seaborn | 无 | 多 | 统计分析、探索性数据分析(EDA) |
核心结论与学习建议:
- pyecharts 综合胜出:在本次评估中,pyecharts 在交互性、美观度、学习资源丰富度以及定制灵活性上取得了最佳平衡,尤其适合本课程目标——构建 Web 交互图表和数据大屏。其背后的 ECharts 引擎在业界被广泛使用,生态成熟。
- 明确场景,精通一个:没有必要掌握所有工具。首先应根据你的核心应用场景(是否需要交互?是否用于Web?)确定主攻工具。对于本课程学员,pyecharts (ECharts) 是推荐深入学习的核心工具。
- 了解其余,按需取用:在精通一个主力工具的基础上,了解其他工具的特长。例如,当需要制作出版级静态图时,知道可以求助于 Matplotlib/Seaborn;当需要与特定 Web 框架深度集成时,可以考虑 Bokeh。
📝 动手练一练
- 思考题:假设你在一家电商公司,需要向运营部门每日提交一份包含“销售额趋势折线图”、“商品品类占比饼图”和“地区销量分布地图”的自动化数据报告,并要求报告可通过网页查看和简单交互(如查看某一天的具体数值)。根据本节知识,你会优先选择哪个可视化工具?为什么?
点击查看参考答案
优先选择 pyecharts。
理由如下:
- 交互性需求:报告要求可通过网页查看和简单交互(如悬停查看数值),pyecharts 生成的 HTML 文件天然支持此类交互。
- 图表类型覆盖:所需折线图 (
Line)、饼图 (Pie)、地图 (Map或Geo) 均是 pyecharts 原生支持且配置成熟的图表类型。 - 自动化与交付:pyecharts 可轻松将图表渲染为独立的 HTML 文件,便于通过邮件发送或部署到内部网页进行每日自动更新。
- 学习与开发效率:其中文文档和丰富示例能加速开发,满足快速生成自动化报告的需求。
虽然 Plotly 和 Bokeh 也满足交互性,但 pyecharts 在中文资料和支持上更有优势,更符合国内团队快速上手和协作的需求。
- 实践题:使用 pyecharts,将本节提供的测试数据
df_test绘制成一个堆叠柱状图,展示两个场景销量之和,并为每个柱子添加数据标签。请写出关键代码并描述配置思路。
点击查看参考答案
from pyecharts.charts import Bar
from pyecharts import options as opts
# 数据准备
x_data = df_test['品牌'].tolist()
# 计算总销量用于堆叠
y1_data = df_test['销量_Y1'].tolist()
y2_data = df_test['销量_Y2'].tolist()
# 创建堆叠柱状图
stack_bar = (
Bar()
.add_xaxis(x_data)
# stack 参数指定相同的堆叠组名,即可实现堆叠
.add_yaxis("场景一销量", y1_data, stack="stack1",
label_opts=opts.LabelOpts(is_show=True, position="inside")) # 显示内部标签
.add_yaxis("场景二销量", y2_data, stack="stack1",
label_opts=opts.LabelOpts(is_show=True, position="inside"))
.set_global_opts(
title_opts=opts.TitleOpts(title="手机品牌销量堆叠对比"),
yaxis_opts=opts.AxisOpts(name="销量"),
# 添加工具箱便于交互
toolbox_opts=opts.ToolboxOpts(),
)
.set_series_opts(
# 全局设置标签样式(也可在add_yaxis中单独设置)
# label_opts=opts.LabelOpts(is_show=True)
)
)
# 输出摘要信息
print(f"图表类型: {type(stack_bar).__name__}, 采用堆叠(Stack)模式。")
print(f"系列堆叠组: {stack_bar.options['series'][0].get('stack')}")图表类型: Bar, 采用堆叠(Stack)模式。
系列堆叠组: stack1配置思路:
- 堆叠关键:在
.add_yaxis()方法中,为需要堆叠的系列设置相同的stack参数值(如"stack1")。 - 数据标签:通过
label_opts=opts.LabelOpts(is_show=True, position="inside")在柱子内部显示具体数值。position可调整为"top","insideLeft"等。 - 交互工具:通过
toolbox_opts=opts.ToolboxOpts()启用默认工具箱,提供保存图片、数据视图、动态类型切换等交互功能。
本章小结
本节我们系统性地构建了一个数据可视化工具的评估框架,并对 Python 中五个主流工具进行了多维度的对比分析。关键在于理解,没有“最好”的工具,只有“最适合”当前场景的工具。
📋 行动清单
- 确立你的主力工具:回顾你的学习或工作项目,明确对交互性和部署形式(Web/静态)的核心需求,确定将深入学习的 1-2 个可视化工具。
- 体验 pyecharts 基础绘图:根据提供的测试数据,尝试运行本节中的 pyecharts 示例代码,感受其链式 API 的编写风格。
- 探索官方 Gallery:访问 pyecharts 官方示例库,浏览其支持的丰富图表类型,为后续学习建立直观印象。
—— 小象教研组
