Pyecharts:Python 与 ECharts 的桥梁,构建声明式交互图表

Pyecharts 是一个基于 Apache ECharts 的强大 Python 图表库,它允许 Python 开发者使用纯 Python 代码,生成 ECharts 所支持的、高度交互式和视觉表现力丰富的图表。

其核心价值在于,它将 ECharts 在 Web 端强大的可视化能力无缝引入了 Python 数据分析工作流,使得在 Jupyter Notebook 或生成独立的 HTML 文件时,能够轻松创建专业级的数据看板。


一、Pyecharts 核心概念与工作流程

Pyecharts 采用声明式的 API 设计。开发者通过链式调用的方式,配置图表的各种属性(如类型、数据、标题、坐标轴等),最终渲染出图表。

其核心流程与 ECharts 一脉相承,但在 Python 环境中实现。

一个基本的 Pyecharts 工作流程如下:

  1. 导入与初始化:从 pyecharts.charts 导入具体的图表类(如 Bar, Line, Pie)。
  2. 添加数据与配置:使用 .add_xaxis(), .add_yaxis() 等方法添加数据,并通过 .set_global_opts().set_series_opts() 进行全局和系列级别的配置。
  3. 渲染输出:通过 .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() 方法可以直接渲染出交互式图表。为了获得最佳体验,可以使用 SnapshoptJupyterLab 等扩展。

# 在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),虽然可以通过 seleniumpyppeteer 等无头浏览器工具进行截图。

对于需要深度集成到桌面 GUI 应用(如 PyQt)或进行复杂数值计算后实时渲染的场景,Matplotlib 可能仍是更直接的选择。

总而言之,Pyecharts 是 Python 数据科学家和分析师将分析结果快速转化为交互式、可共享的可视化报告的首选工具之一

它极大地降低了创建专业级 Web 图表的门槛,是连接数据分析与成果展示的高效桥梁。


参考来源

 

更多推荐