一文精通 Pyecharts:从入门到实战,打造高颜值交互式数据可视化
Pyecharts是一款基于ECharts的Python数据可视化库,具有交互性强、图表美观、学习成本低等优势。本文从安装到实战,通过6个常用图表案例(如柱状图、饼图、地图等)展示其核心功能。Pyecharts支持HTML输出、Web框架集成,让开发者无需JavaScript知识即可创建专业级交互式图表。所有案例均提供完整代码,适合数据分析报告、Dashboard开发等场景。
一文精通 Pyecharts:从入门到实战,打造高颜值交互式数据可视化
前言
在数据驱动决策的时代,数据可视化不仅是“让数据说话”的工具,更是提升数据洞察力的核心手段。Python 生态中有众多可视化库(如 Matplotlib、Seaborn),但它们多以静态图表为主,难以满足Web端交互式展示的需求。而 Pyecharts 的出现,完美解决了这一痛点——它基于百度 ECharts 的强大交互能力,通过 Python 简洁的语法封装,让开发者无需编写复杂的 JavaScript 代码,就能快速生成高颜值、可交互、支持动态渲染的可视化图表。
无论是数据分析报告、Dashboard 搭建,还是 Web 应用集成,Pyecharts 都能以极低的学习成本,交付专业级的可视化效果。本文将从 环境搭建、核心特性、基础图表实战、进阶交互设计、Web 集成 五个维度,带大家从入门到精通 Pyecharts,所有案例均附完整可运行代码,可直接落地使用。
一、Pyecharts 核心优势:为何选择它?
在众多可视化库中,Pyecharts 能脱颖而出,源于其不可替代的核心优势:
- 极致交互体验:支持鼠标hover显示详情、缩放、平移、数据筛选、动态切换系列等交互操作,远超静态图表;
- 高颜值可视化:内置几十种专业配色方案与图表样式,支持自定义主题,图表美观度拉满;
- 零前端门槛:纯 Python 语法编写,无需掌握 ECharts 的 JavaScript 语法,降低Web可视化门槛;
- 丰富图表类型:覆盖折线图、柱状图、饼图、地图、雷达图、桑基图等 40+ 图表类型,满足各类场景需求;
- 灵活输出方式:支持生成 HTML 文件(直接打开使用)、嵌入 Flask/Django 等 Web 框架、导出图片,适配多场景使用;
- 完善文档支持:官方文档详细,示例丰富,社区活跃,问题易解决。
二、环境搭建:5分钟快速上手
Pyecharts 支持 Python 3.6+ 版本,安装与入门流程极为简单:
1. 安装 Pyecharts
通过 pip 一键安装(推荐安装最新稳定版):
pip install pyecharts -U
2. 第一个 Pyecharts 图表(Hello World)
Pyecharts 的核心逻辑是「实例化图表对象 → 添加数据与配置 → 输出图表」,以下是最简单的折线图示例:
# 导入折线图类
from pyecharts import options as opts
from pyecharts.charts import Line
# 1. 实例化折线图对象(设置图表标题、尺寸)
line = (
Line(init_opts=opts.InitOpts(title="Pyecharts 入门示例 - 折线图", width="1000px", height="600px"))
# 2. 添加 X 轴数据
.add_xaxis(xaxis_data=["周一", "周二", "周三", "周四", "周五", "周六", "周日"])
# 3. 添加 Y 轴数据(系列名称 + 数据列表)
.add_yaxis(series_name="日销售额", y_axis=[120, 200, 150, 250, 180, 300, 280])
# 4. 设置全局配置(坐标轴标签、图例位置等)
.set_global_opts(
xaxis_opts=opts.AxisOpts(name="日期", name_location="middle", name_gap=30),
yaxis_opts=opts.AxisOpts(name="销售额(元)"),
legend_opts=opts.LegendOpts(pos_left="center")
)
)
# 5. 输出图表(生成 HTML 文件,直接打开即可查看)
line.render("first_pyecharts.html")
3. 运行效果
执行代码后,当前目录会生成 first_pyecharts.html 文件,用浏览器打开即可看到:
- 鼠标hover时显示具体销售额;
- 支持鼠标滚轮缩放图表;
- 点击图例可隐藏/显示数据系列;
- 支持下载图表为图片。
三、核心概念与基础图表实战
Pyecharts 的核心是「图表类 + 配置项」,所有图表的构建都围绕这两个核心展开。下面将通过 6个高频实用图表案例,覆盖 80% 的业务场景,同时讲解核心配置逻辑。
1. 柱状图(并列+堆叠,适用于分类对比)
柱状图是分类数据对比的首选,Pyecharts 支持普通柱状图、并列柱状图、堆叠柱状图等多种样式,以下是「产品销量对比 + 同比增长」的并列柱状图案例:
from pyecharts import options as opts
from pyecharts.charts import Bar
# 数据准备
products = ["手机", "电脑", "平板", "耳机", "手表"]
2025销量 = [1500, 800, 600, 1200, 500]
2024销量 = [1200, 650, 450, 900, 350]
# 构建并列柱状图
bar = (
Bar(init_opts=opts.InitOpts(title="2024-2025 产品销量对比", width="1200px"))
# X 轴:产品名称
.add_xaxis(xaxis_data=products)
# 第一个 Y 轴:2025销量(蓝色)
.add_yaxis(
series_name="2025年销量",
y_axis=2025销量,
itemstyle_opts=opts.ItemStyleOpts(color="#1f77b4")
)
# 第二个 Y 轴:2024销量(橙色)
.add_yaxis(
series_name="2024年销量",
y_axis=2024销量,
itemstyle_opts=opts.ItemStyleOpts(color="#ff7f0e")
)
# 全局配置
.set_global_opts(
xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=30)), # X轴标签旋转30度
yaxis_opts=opts.AxisOpts(name="销量(台)"),
legend_opts=opts.LegendOpts(pos_top="5%"),
# 开启数据筛选工具栏
datazoom_opts=[opts.DataZoomOpts(range_start=0, range_end=100)]
)
# 系列配置(每个柱子上显示具体数值)
.set_series_opts(
label_opts=opts.LabelOpts(is_show=True, position="top")
)
)
bar.render("product_sales_comparison.html")
2. 饼图(环形+玫瑰图,适用于占比分析)
饼图用于展示数据占比,Pyecharts 支持普通饼图、环形饼图、玫瑰图等,以下是「用户年龄段分布」的环形饼图案例,添加了数据标签与百分比显示:
from pyecharts import options as opts
from pyecharts.charts import Pie
# 数据准备(年龄段 + 人数)
age_data = [("18-25岁", 350), ("26-35岁", 520), ("36-45岁", 280), ("46-55岁", 150), ("55岁以上", 80)]
# 构建环形饼图
pie = (
Pie(init_opts=opts.InitOpts(title="用户年龄段分布", width="800px", height="600px"))
# 添加数据(name 为系列名称,data_pair 为(标签,数值)列表)
.add(
series_name="用户数",
data_pair=age_data,
# 环形设置(内圆半径20%,外圆半径70%)
radius=["20%", "70%"],
# 标签设置(显示标签 + 百分比)
label_opts=opts.LabelOpts(
is_show=True,
formatter="{b}: {c}人 ({d}%)" # 标签格式:名称:数值(百分比)
)
)
# 全局配置(图例位置 + 配色方案)
.set_global_opts(
legend_opts=opts.LegendOpts(pos_left="left", orient="vertical"),
# 自定义配色(支持RGB/十六进制)
color_opts=[
"#FF6B6B", "#4ECDC4", "#45B7D1", "#96CEB4", "#FECA57"
]
)
)
pie.render("user_age_distribution.html")
3. 地图(中国/省级/市级,适用于地理数据展示)
Pyecharts 内置了中国地图、省级地图、市级地图等地理数据,支持热力图、散点图、区域着色等多种地图类型,以下是「全国各省份销售额热力图」案例:
from pyecharts import options as opts
from pyecharts.charts import Map
from pyecharts.globals import ThemeType
# 数据准备(省份名称 + 销售额,省份名称需与地图内置名称一致)
sales_data = [
("北京", 1200), ("上海", 1500), ("广东", 2000), ("江苏", 1800), ("浙江", 1600),
("山东", 1300), ("四川", 900), ("湖北", 800), ("河南", 1100), ("河北", 700)
]
# 构建地图热力图
map_china = (
Map(init_opts=opts.InitOpts(title="全国各省份销售额热力图", theme=ThemeType.MACARONS))
# 添加中国地图数据
.add(
series_name="销售额(万元)",
data_pair=sales_data,
maptype="china" # maptype 可选:china/province/城市名称(如"广东")
)
# 全局配置(颜色渐变 + 图例 + 视觉映射)
.set_global_opts(
# 视觉映射(热力图颜色渐变)
visualmap_opts=opts.VisualMapOpts(
is_show=True,
min_=500,
max_=2000,
range_color=["#E0FFFF", "#006edd"] # 浅蓝到深蓝渐变
),
legend_opts=opts.LegendOpts(is_show=False)
)
)
map_china.render("china_sales_heatmap.html")
4. 雷达图(适用于多维度能力评估)
雷达图用于展示多维度数据的综合表现,如产品性能评分、用户能力评估等,以下是「3款手机多维度性能对比」案例:
from pyecharts import options as opts
from pyecharts.charts import Radar
# 数据准备(维度 + 3款手机的评分)
dimensions = ["性能", "续航", "拍照", "外观", "价格"]
phone1_scores = [95, 80, 90, 85, 70] # 旗舰机
phone2_scores = [80, 85, 82, 90, 85] # 中端机
phone3_scores = [65, 90, 75, 80, 95] # 性价比机
# 构建雷达图
radar = (
Radar(init_opts=opts.InitOpts(title="3款手机多维度性能对比", width="1000px"))
# 设置雷达维度(每个维度的最大值)
.add_schema(
schema=[opts.RadarIndicatorItem(name=dim, max_=100) for dim in dimensions],
shape="polygon" # 雷达图形状:polygon(多边形)/circle(圆形)
)
# 添加3款手机的数据
.add(series_name="旗舰机", data=[phone1_scores], color="#FF6B6B")
.add(series_name="中端机", data=[phone2_scores], color="#4ECDC4")
.add(series_name="性价比机", data=[phone3_scores], color="#45B7D1")
# 全局配置(图例 + 标签)
.set_global_opts(
legend_opts=opts.LegendOpts(pos_top="5%"),
label_opts=opts.LabelOpts(is_show=True)
)
)
radar.render("phone_performance_radar.html")
5. 散点图(适用于相关性分析)
散点图用于展示两个变量之间的相关性,支持添加趋势线、分组着色等,以下是「广告投入与销售额相关性分析」案例:
from pyecharts import options as opts
from pyecharts.charts import Scatter
import random
# 数据准备(随机生成100组广告投入-销售额数据,模拟正相关)
data = []
for _ in range(100):
ad_cost = random.uniform(10, 100) # 广告投入(10-100万元)
sales = 2 * ad_cost + random.uniform(50, 100) # 销售额(正相关 + 随机波动)
data.append([ad_cost, sales])
# 构建散点图
scatter = (
Scatter(init_opts=opts.InitOpts(title="广告投入与销售额相关性分析", width="1000px"))
.add_xaxis(xaxis_data=[d[0] for d in data])
.add_yaxis(
series_name="广告投入-销售额",
y_axis=data,
# 散点样式(大小 + 颜色渐变)
itemstyle_opts=opts.ItemStyleOpts(
color="#FF6B6B",
opacity=0.6 # 透明度,避免点重叠
),
symbol_size=10 # 散点大小
)
.set_global_opts(
xaxis_opts=opts.AxisOpts(name="广告投入(万元)", type_="value"),
yaxis_opts=opts.AxisOpts(name="销售额(万元)", type_="value"),
# 开启数据缩放
datazoom_opts=[opts.DataZoomOpts(range_start=0, range_end=100)],
# 视觉映射(按销售额着色)
visualmap_opts=opts.VisualMapOpts(
type_="color",
max_=300,
min_=100,
dimension=1 # 按第二个维度(销售额)着色
)
)
)
scatter.render("ad_sales_correlation.html")
6. 组合图表(折线图+柱状图,适用于多指标展示)
Pyecharts 支持在同一图表中组合多种类型(如折线图+柱状图),适用于同时展示“数值+趋势”,以下是「月度销售额(柱状图)+ 同比增长率(折线图)」案例:
from pyecharts import options as opts
from pyecharts.charts import Bar, Line
from pyecharts.commons.utils import JsCode
# 数据准备
months = ["1月", "2月", "3月", "4月", "5月", "6月"]
sales = [1200, 1500, 1300, 1800, 2000, 2200]
growth_rate = [10, 15, 8, 20, 12, 18] # 同比增长率(%)
# 1. 构建柱状图(销售额)
bar = (
Bar(init_opts=opts.InitOpts(title="月度销售额与同比增长率", width="1200px"))
.add_xaxis(months)
.add_yaxis(
series_name="销售额(万元)",
y_axis=sales,
itemstyle_opts=opts.ItemStyleOpts(color="#1f77b4")
)
.set_global_opts(
xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=30)),
yaxis_opts=opts.AxisOpts(name="销售额(万元)"),
legend_opts=opts.LegendOpts(pos_top="5%")
)
.set_series_opts(label_opts=opts.LabelOpts(is_show=True, position="top"))
)
# 2. 叠加折线图(增长率),共享X轴,使用右侧Y轴
line = (
Line()
.add_xaxis(months)
.add_yaxis(
series_name="同比增长率(%)",
y_axis=growth_rate,
yaxis_index=1, # 使用第二个Y轴
itemstyle_opts=opts.ItemStyleOpts(color="#FF6B6B"),
linestyle_opts=opts.LineStyleOpts(width=3),
markpoint_opts=opts.MarkPointOpts( # 显示最大值/最小值
data=[opts.MarkPointItem(type_="max"), opts.MarkPointItem(type_="min")]
)
)
.set_global_opts(
# 添加右侧Y轴(增长率)
yaxis_opts=opts.AxisOpts(
name="增长率(%)",
yaxis_index=1,
position="right",
axisline_opts=opts.AxisLineOpts(color="#FF6B6B")
)
)
)
# 3. 组合图表
bar.overlap(line)
bar.render("sales_growth_combined.html")
四、进阶技巧:交互优化与动态渲染
Pyecharts 的核心优势是交互性,通过以下进阶技巧,可让图表更具实用性与观赏性:
1. 自定义主题与配色
Pyecharts 内置了 10+ 主题(如 ThemeType.MACARONS、ThemeType.VINTAGE),也支持自定义配色方案:
# 自定义配色案例(饼图)
pie.set_global_opts(
color_opts=[
"#FF6B6B", "#4ECDC4", "#45B7D1", "#96CEB4", "#FECA57",
"#FF9FF3", "#54A0FF", "#5F27CD", "#00D2D3"
]
)
2. 动态加载数据(适用于大数据场景)
当数据量较大时,可通过 datazoom 实现滚动加载,或通过 JsCode 实现动态筛选:
# 大数据柱状图(添加滚动条)
bar.set_global_opts(
datazoom_opts=[
opts.DataZoomOpts(type_="slider", range_start=0, range_end=50), # 底部滚动条
opts.DataZoomOpts(type_="inside") # 鼠标滚轮缩放
]
)
3. 添加交互事件(如点击事件)
通过 set_series_opts 的 itemstyle_opts 或 label_opts,可添加点击事件(需要结合 JavaScript 代码):
# 点击柱子弹出详情(示例)
bar.set_series_opts(
itemstyle_opts=opts.ItemStyleOpts(
color=JsCode("""
function(params) {
// 点击事件:弹出当前柱子的名称和数值
myChart.on('click', function(params) {
alert(params.name + ':' + params.value + '元');
});
return '#1f77b4';
}
""")
)
)
4. 导出图片(PNG/PDF)
Pyecharts 支持将图表导出为图片,需安装 selenium 依赖:
pip install selenium
# 导出图片
from pyecharts.render import make_snapshot
from snapshot_selenium import snapshot
# 将之前的折线图导出为 PNG
make_snapshot(snapshot, line.render(), "line_chart.png")
五、Web 集成:嵌入 Flask/Django 应用
Pyecharts 生成的 HTML 可直接嵌入 Web 框架,以下是 Flask 集成示例:
1. Flask 集成步骤
# app.py
from flask import Flask, render_template
from pyecharts import options as opts
from pyecharts.charts import Line
app = Flask(__name__)
# 生成图表(返回 HTML 字符串,而非保存文件)
def generate_line_chart():
line = (
Line()
.add_xaxis(["周一", "周二", "周三", "周四", "周五"])
.add_yaxis("销售额", [120, 200, 150, 250, 180])
.set_global_opts(title_opts=opts.TitleOpts(title="Flask + Pyecharts 示例"))
)
# 返回图表的 HTML 字符串
return line.render_embed()
# 路由:访问 / 时展示图表
@app.route("/")
def index():
chart_html = generate_line_chart()
# 传递 HTML 字符串到模板
return render_template("index.html", chart_html=chart_html)
if __name__ == "__main__":
app.run(debug=True)
2. 模板文件(templates/index.html)
<!DOCTYPE html>
<html>
<head>
<title>Pyecharts + Flask</title>
</head>
<body>
<h1>销售额统计图表</h1>
<!-- 渲染 Pyecharts 图表 -->
{{ chart_html|safe }}
</body>
</html>
运行 Flask 应用后,访问 http://127.0.0.1:5000 即可在 Web 页面中看到交互式图表。
六、实战案例:电商数据分析 Dashboard
结合前面的基础图表,我们构建一个「电商数据分析 Dashboard」,整合柱状图、饼图、地图、折线图,展示核心业务指标:
from pyecharts import options as opts
from pyecharts.charts import Bar, Pie, Map, Line
from pyecharts.globals import ThemeType
from pyecharts.commons.utils import JsCode
# 数据准备(模拟电商数据)
# 1. 月度销售额
months = ["1月", "2月", "3月", "4月", "5月", "6月"]
sales = [1200, 1500, 1300, 1800, 2000, 2200]
# 2. 商品类别占比
category_data = [("电子产品", 45), ("服装", 30), ("食品", 15), ("日用品", 10)]
# 3. 省份销售额
province_sales = [("广东", 2000), ("江苏", 1800), ("浙江", 1600), ("上海", 1500), ("北京", 1200)]
# 4. 用户复购率
repurchase_rate = [20, 25, 22, 30, 35, 40]
# 1. 构建月度销售额折线图
line = (
Line(init_opts=opts.InitOpts(theme=ThemeType.MACARONS))
.add_xaxis(months)
.add_yaxis("销售额(万元)", sales, markline_opts=opts.MarkLineOpts(data=[opts.MarkLineItem(type_="average")]))
.set_global_opts(title_opts=opts.TitleOpts(title="月度销售额趋势", pos_left="center"))
)
# 2. 构建商品类别饼图
pie = (
Pie()
.add("", category_data, radius=["30%", "70%"])
.set_global_opts(title_opts=opts.TitleOpts(title="商品类别占比", pos_left="center"))
.set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {d}%"))
)
# 3. 构建省份销售额地图
map_china = (
Map()
.add("销售额(万元)", province_sales, "china")
.set_global_opts(
title_opts=opts.TitleOpts(title="全国省份销售额", pos_left="center"),
visualmap_opts=opts.VisualMapOpts(min_=1000, max_=2000)
)
)
# 4. 构建复购率柱状图
bar = (
Bar()
.add_xaxis(months)
.add_yaxis("复购率(%)", repurchase_rate, itemstyle_opts=opts.ItemStyleOpts(color="#FF6B6B"))
.set_global_opts(title_opts=opts.TitleOpts(title="月度用户复购率", pos_left="center"))
.set_series_opts(label_opts=opts.LabelOpts(is_show=True, position="top"))
)
# 5. 组合所有图表到一个 HTML(通过 iframe 嵌入)
dashboard_html = f"""
<!DOCTYPE html>
<html>
<head>
<title>电商数据分析 Dashboard</title>
<style>
.container {{ display: grid; grid-template-columns: 1fr 1fr; gap: 20px; margin: 20px; }}
.chart {{ width: 100%; height: 400px; }}
</style>
</head>
<body>
<h1 style="text-align: center;">电商数据分析 Dashboard</h1>
<div class="container">
<iframe class="chart" srcdoc="{line.render_embed()}" frameborder="0"></iframe>
<iframe class="chart" srcdoc="{pie.render_embed()}" frameborder="0"></iframe>
<iframe class="chart" srcdoc="{map_china.render_embed()}" frameborder="0"></iframe>
<iframe class="chart" srcdoc="{bar.render_embed()}" frameborder="0"></iframe>
</div>
</body>
</html>
"""
# 保存 Dashboard
with open("ecommerce_dashboard.html", "w", encoding="utf-8") as f:
f.write(dashboard_html)
print("Dashboard 生成完成:ecommerce_dashboard.html")
运行代码后,打开 ecommerce_dashboard.html,即可看到一个包含 4 个图表的交互式 Dashboard,支持独立操作每个图表。
七、总结与进阶学习
Pyecharts 以其「低门槛、高颜值、强交互」的特点,成为 Python Web 可视化的首选工具。本文通过 6 个基础图表、1 个实战 Dashboard、Web 集成示例,覆盖了大部分业务场景,核心要点总结如下:
- 核心流程:「实例化图表 → 添加数据 → 配置样式 → 输出/集成」;
- 高频图表:柱状图(分类对比)、饼图(占比)、地图(地理数据)、雷达图(多维度)、组合图表(多指标);
- 进阶技巧:自定义主题、交互事件、动态加载、Web 集成;
- 适用场景:数据分析报告、业务 Dashboard、Web 应用可视化、学术论文图表。
进阶学习资源
- 官方文档:Pyecharts 官方文档(示例丰富,配置详细);
- 图表gallery:Pyecharts Gallery(海量现成图表案例,可直接复用);
- 源码学习:GitHub 仓库(https://github.com/pyecharts/pyecharts),了解底层封装逻辑。
通过本文的学习,你已经具备了使用 Pyecharts 构建专业级可视化图表的能力。在实际业务中,可根据数据特点选择合适的图表类型,通过自定义配置优化交互体验,让数据可视化真正成为辅助决策的利器!
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐

所有评论(0)