Pyecharts入门指南:一键生成交互式图表(Python 可视化图表实战附代码)
Pyecharts:Python 与 ECharts 的桥梁,构建声明式交互图表
Pyecharts 是一个基于 Apache ECharts 的强大 Python 图表库,它允许 Python 开发者使用纯 Python 代码,生成 ECharts 所支持的、高度交互式和视觉表现力丰富的图表。
其核心价值在于,它将 ECharts 在 Web 端强大的可视化能力无缝引入了 Python 数据分析工作流,使得在 Jupyter Notebook 或生成独立的 HTML 文件时,能够轻松创建专业级的数据看板。
一、Pyecharts 核心概念与工作流程
Pyecharts 采用声明式的 API 设计。开发者通过链式调用的方式,配置图表的各种属性(如类型、数据、标题、坐标轴等),最终渲染出图表。
其核心流程与 ECharts 一脉相承,但在 Python 环境中实现。
一个基本的 Pyecharts 工作流程如下:
- 导入与初始化:从
pyecharts.charts导入具体的图表类(如Bar,Line,Pie)。 - 添加数据与配置:使用
.add_xaxis(),.add_yaxis()等方法添加数据,并通过.set_global_opts()和.set_series_opts()进行全局和系列级别的配置。 - 渲染输出:通过
.render()生成 HTML 文件,或在 Jupyter Notebook 中使用.render_notebook()内嵌显示。
以下是一个最基础的条形图示例,展示了其核心 API 结构:
# 示例1:基础条形图
from pyecharts.charts import Bar
from pyecharts import options as opts
# 1. 初始化图表对象
bar = Bar()
# 2. 添加数据与基础配置(链式调用)
bar.add_xaxis(["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"])
bar.add_yaxis("商家A", [5, 20, 36, 10, 75, 90])
bar.add_yaxis("商家B", [15, 6, 45, 20, 35, 66])
# 3. 设置全局配置项(标题、工具箱等)
bar.set_global_opts(
title_opts=opts.TitleOpts(title="主标题", subtitle="副标题"),
toolbox_opts=opts.ToolboxOpts(), # 显示工具箱(保存图片、数据视图等)
xaxis_opts=opts.AxisOpts(name="商品类别"),
yaxis_opts=opts.AxisOpts(name="销量")
)
# 4. 渲染为HTML文件
bar.render("basic_bar.html")
# 在 Jupyter Notebook 中直接显示使用: bar.render_notebook()
执行此代码会生成一个名为 basic_bar.html 的文件,在浏览器中打开即可看到一个功能完整的交互式条形图,支持缩放、拖拽、数据视图切换和图片保存。
二、Pyecharts 核心组件与配置详解
Pyecharts 的配置系统是其强大功能的基石,主要分为全局配置 (set_global_opts) 和系列配置 (set_series_opts)。
| 配置类别 | 核心组件/选项 | 功能说明 | 常用参数示例 |
|---|---|---|---|
| 全局配置 | TitleOpts |
设置图表主标题和副标题 | title, subtitle, pos_left, title_textstyle_opts |
LegendOpts |
控制图例的显示与交互 | is_show, type_=’scroll’, pos_top, orient=’vertical’ |
|
TooltipOpts |
配置鼠标悬停提示框 | trigger=’axis’(坐标轴触发), formatter(自定义格式) |
|
ToolboxOpts |
显示右侧工具箱 | is_show=True, feature 中定义 SaveAsImage, DataView, Restore 等工具 |
|
AxisOpts |
配置坐标轴(X/Y轴) | name, type_=’category’ 或 ’value’, min_, max_, axislabel_opts |
|
VisualMapOpts |
视觉映射组件,用于连续数据分段着色 | type_=’continuous’, min_, max_, range_color, is_calculable=True |
|
| 系列配置 | LabelOpts |
控制图形上数据标签的显示 | is_show, position, formatter |
ItemStyleOpts |
设置图形样式(颜色、边框等) | color, border_color, border_width, opacity |
|
LineStyleOpts |
设置线型图的线条样式 | width, type_=’dashed’, curveness(用于关系图) |
|
AreaStyleOpts |
设置区域填充样式 | opacity, color |
|
MarkPointOpts |
系列标注点(最大值、最小值等) | data=[opts.MarkPointItem(type_=”max”, name=”最大值”)] |
|
MarkLineOpts |
系列标线(平均值线等) | data=[opts.MarkLineItem(type_=”average”, name=”平均值”)] |
一个综合运用全局和系列配置的折线图示例:
# 示例2:配置丰富的折线图
from pyecharts.charts import Line
from pyecharts import options as opts
import random
# 生成模拟数据
categories = ['周一', '周二', '周三', '周四', '周五', '周六', '周日']
data_a = [random.randint(10, 50) for _ in range(7)]
data_b = [random.randint(20, 60) for _ in range(7)]
line = (
Line()
.add_xaxis(categories)
.add_yaxis(
series_name="产品A", # 系列名称
y_axis=data_a,
is_smooth=True, # 平滑曲线
symbol="triangle", # 数据点形状
symbol_size=12,
linestyle_opts=opts.LineStyleOpts(width=3, type_="solid"),
label_opts=opts.LabelOpts(is_show=True, position="top"), # 显示数据标签
markpoint_opts=opts.MarkPointOpts( # 标注点
data=[
opts.MarkPointItem(type_="max", name="最大值"),
opts.MarkPointItem(type_="min", name="最小值"),
]
),
markline_opts=opts.MarkLineOpts( # 标注线
data=[opts.MarkLineItem(type_="average", name="平均值")]
),
)
.add_yaxis("产品B", data_b, is_smooth=True, symbol="circle")
.set_global_opts(
title_opts=opts.TitleOpts(title="产品周销量趋势", subtitle="带标注的折线图"),
tooltip_opts=opts.TooltipOpts(trigger="axis", axis_pointer_type="cross"),
toolbox_opts=opts.ToolboxOpts(is_show=True),
xaxis_opts=opts.AxisOpts(name="日期", boundary_gap=False), # 坐标轴紧贴边缘
yaxis_opts=opts.AxisOpts(
name="销量",
type_="value",
splitline_opts=opts.SplitLineOpts(is_show=True), # 显示网格线
),
)
)
line.render("configured_line_chart.html")
三、高级图表类型实战
Pyecharts 支持 ECharts 绝大部分图表类型,以下展示几种在 Matplotlib 中实现较复杂或需要更多代码的图表。
1. 桑基图 (Sankey)
桑基图常用于展示流量、能量或成本的流转路径。在 Pyecharts 中,其核心是定义 nodes(节点)和 links(边)。
# 示例3:桑基图 - 用户行为路径分析
from pyecharts.charts import Sankey
from pyecharts import options as opts
nodes = [ # 定义所有节点
{"name": "访问首页"},
{"name": "浏览商品"},
{"name": "加入购物车"},
{"name": "提交订单"},
{"name": "支付成功"},
{"name": "完成交易"},
{"name": "中途离开"},
]
links = [ # 定义节点间的流量关系 [source, target, value]
{"source": "访问首页", "target": "浏览商品", "value": 10000},
{"source": "浏览商品", "target": "加入购物车", "value": 4000},
{"source": "浏览商品", "target": "中途离开", "value": 6000},
{"source": "加入购物车", "target": "提交订单", "value": 3000},
{"source": "加入购物车", "target": "中途离开", "value": 1000},
{"source": "提交订单", "target": "支付成功", "value": 2500},
{"source": "提交订单", "target": "中途离开", "value": 500},
{"source": "支付成功", "target": "完成交易", "value": 2500},
]
sankey = (
Sankey(init_opts=opts.InitOpts(width="1200px", height="600px"))
.add(
series_name="", # 桑基图通常不需要系列名
nodes=nodes,
links=links,
pos_top="10%",
focus_node_adjacency=True, # 悬停时高亮关联边
linestyle_opt=opts.LineStyleOpts(opacity=0.3, curve=0.5, color="source"),
label_opts=opts.LabelOpts(position="right"),
)
.set_global_opts(title_opts=opts.TitleOpts(title="电商用户行为转化桑基图"))
)
sankey.render("user_journey_sankey.html")
2. 地理坐标系图表 (Geo/Map)
Pyecharts 内置了丰富的地图支持,可以轻松绘制中国及世界地图。
# 示例4:中国地图 - 数据分布
from pyecharts.charts import Map
from pyecharts import options as opts
from pyecharts.globals import ThemeType
# 模拟各省份数据
data = [
("广东", 190),
("北京", 120),
("上海", 110),
("浙江", 90),
("江苏", 85),
("四川", 70),
("湖北", 65),
("湖南", 60),
# ... 其他省份数据
]
# 使用Map类(适用于分段型数据)
map_chart = (
Map(init_opts=opts.InitOpts(theme=ThemeType.LIGHT, width="1000px", height="600px"))
.add(
series_name="销售额(亿元)",
data_pair=data,
maptype="china", # 指定地图类型
is_map_symbol_show=False, # 不显示标记点
label_opts=opts.LabelOpts(is_show=True), # 显示省份名称
)
.set_global_opts(
title_opts=opts.TitleOpts(title="全国销售数据分布"),
visualmap_opts=opts.VisualMapOpts( # 视觉映射组件
max_=200,
is_piecewise=True, # 分段显示
pieces=[
{"min": 150, "label": "> 150", "color": "#B22222"},
{"min": 100, "max": 150, "label": "100-150", "color": "#FF4500"},
{"min": 50, "max": 100, "label": "50-100", "color": "#FFD700"},
{"min": 0, "max": 50, "label": "0-50", "color": "#ADFF2F"},
]
),
tooltip_opts=opts.TooltipOpts(
trigger="item", formatter="{b}<br/>{c} (亿元)"
),
)
)
map_chart.render("china_sales_map.html")
3. 3D 图表
Pyecharts 也支持基础的 3D 图表,如 3D 散点图、曲面图等。
# 示例5:3D散点图
from pyecharts.charts import Scatter3D
from pyecharts import options as opts
import random
# 生成3D随机数据
data = [[random.randint(0, 100), random.randint(0, 100), random.randint(0, 100)] for _ in range(80)]
scatter3d = (
Scatter3D(init_opts=opts.InitOpts(width="800px", height="600px"))
.add(
series_name="",
data=data,
xaxis3d_opts=opts.Axis3DOpts(type_="value", name="X轴"),
yaxis3d_opts=opts.Axis3DOpts(type_="value", name="Y轴"),
zaxis3d_opts=opts.Axis3DOpts(type_="value", name="Z轴"),
grid3d_opts=opts.Grid3DOpts(width=100, depth=100, is_rotate=True), # 启用自动旋转
)
.set_global_opts(
title_opts=opts.TitleOpts(title="3D散点图示例"),
visualmap_opts=opts.VisualMapOpts(
dimension=2, # 根据第三维(Z轴)的值进行颜色映射
max_=100,
range_color=["#313695", "#4575b4", "#74add1", "#abd9e9", "#e0f3f8", "#ffffbf", "#fee090", "#fdae61", "#f46d43", "#d73027", "#a50026"],
),
)
)
scatter3d.render("3d_scatter.html")
四、进阶特性与组合应用
1. 图表组合 (Grid, Tab, Page)
Pyecharts 提供了 Grid, Tab, Page 等布局类,用于将多个图表组合在一起。
# 示例6:使用Grid组合多个图表(并排显示)
from pyecharts.charts import Bar, Line, Grid
from pyecharts import options as opts
bar = (
Bar()
.add_xaxis(["A", "B", "C", "D", "E"])
.add_yaxis("系列1", [10, 20, 30, 40, 50])
.set_global_opts(title_opts=opts.TitleOpts(title="柱状图", pos_left="5%"))
)
line = (
Line()
.add_xaxis(["A", "B", "C", "D", "E"])
.add_yaxis("系列2", [25, 20, 36, 28, 45])
.set_global_opts(
title_opts=opts.TitleOpts(title="折线图", pos_right="5%"),
legend_opts=opts.LegendOpts(pos_right="20%"),
)
)
# 使用Grid布局,将两个图表左右排列
grid = (
Grid(init_opts=opts.InitOpts(width="1200px"))
.add(bar, grid_opts=opts.GridOpts(pos_left="55%")) # 柱状图占左侧55%
.add(line, grid_opts=opts.GridOpts(pos_right="55%")) # 折线图占右侧55%
)
grid.render("grid_layout.html")
2. 自定义主题与渲染配置
Pyecharts 支持多种内置主题,并允许自定义颜色。
from pyecharts.globals import ThemeType, CurrentConfig
from pyecharts.charts import Pie
# 使用内置主题
pie = (
Pie(init_opts=opts.InitOpts(theme=ThemeType.DARK)) # 使用暗色主题
.add("", [("A", 55), ("B", 25), ("C", 20)])
.set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c} ({d}%)"))
)
pie.render("dark_theme_pie.html")
# 自定义主题颜色(需在渲染前设置)
CurrentConfig.ONLINE_HOST = "https://cdn.jsdelivr.net/npm/echarts@5.4.3/dist/" # 指定在线资源地址
# 更复杂的主题定制可以通过注册 ThemeType 实现
3. 在 Jupyter Notebook 中实现完美交互
在 Jupyter 环境中,render_notebook() 方法可以直接渲染出交互式图表。为了获得最佳体验,可以使用 Snapshopt 或 JupyterLab 等扩展。
# 在Jupyter Notebook单元格中直接运行
from pyecharts.charts import Bar
from pyecharts.globals import CurrentConfig, NotebookType
# 配置Jupyter渲染环境(可选,新版本通常自动检测)
CurrentConfig.NOTEBOOK_TYPE = NotebookType.JUPYTER_NOTEBOOK
bar = Bar().add_xaxis(["Python", "Java", "C++"]).add_yaxis("流行度", [100, 80, 60])
bar.load_javascript() # 确保JS依赖加载
bar.render_notebook() # 直接在单元格输出图表
五、总结:Pyecharts 的优势与适用场景
Pyecharts 成功地将 ECharts 的威力带入了 Python 生态。其声明式、链式调用的 API 使得图表构建逻辑清晰直观。相比于 Matplotlib,它在交互性(缩放、拖拽、数据视图、提示框)和图表美观度上具有压倒性优势,特别适合生成用于Web展示、报告或仪表盘的 HTML 文件。
对于需要复杂地理可视化、关系图(桑基图、关系图)或3D图表的场景,Pyecharts 提供了远比 Matplotlib 更简单的实现路径。
然而,它也有其局限性:作为 Python 和 JavaScript 之间的桥梁,其渲染依赖于浏览器环境,无法直接生成高质量的静态出版级图片(如 PDF 或高分辨率 PNG),虽然可以通过 selenium 或 pyppeteer 等无头浏览器工具进行截图。
对于需要深度集成到桌面 GUI 应用(如 PyQt)或进行复杂数值计算后实时渲染的场景,Matplotlib 可能仍是更直接的选择。
总而言之,Pyecharts 是 Python 数据科学家和分析师将分析结果快速转化为交互式、可共享的可视化报告的首选工具之一。
它极大地降低了创建专业级 Web 图表的门槛,是连接数据分析与成果展示的高效桥梁。
参考来源
更多推荐
所有评论(0)