github star gitee star atomgit star PyPI Downloads AI 编程 AI 交流群

大家好,我是正在实战各种AI项目的程序员晚枫。

今天学习Pyecharts,这是一个生成ECharts图表的Python库。

用它可以轻松制作高颜值的交互式图表:鼠标悬停显示详情、点击图例筛选、缩放拖拽……非常适合做数据大屏和Web展示。


为什么选择Pyecharts?

优势

美观:基于百度ECharts,颜值在线
交互:支持鼠标悬停、缩放、筛选等交互
丰富:30+种图表类型
Web友好:生成HTML文件,可直接嵌入网页

对比

特性MatplotlibPyecharts
静态/动态静态交互式
输出格式PNG/PDFHTML
适用场景论文/报告Web/大屏
学习曲线中等简单

安装与基础用法

1
pip install pyecharts
1
2
3
4
from pyecharts.charts import Bar, Line, Pie, Map
from pyecharts import options as opts
import pandas as pd
import numpy as np

1. 柱状图(Bar)

1
2
3
4
5
6
7
# 基础柱状图
bar = Bar()
bar.add_xaxis(["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"])
bar.add_yaxis("商家A", [5, 20, 36, 10, 75, 90])
bar.add_yaxis("商家B", [15, 25, 16, 55, 48, 8])
bar.set_global_opts(title_opts=opts.TitleOpts(title="主标题", subtitle="副标题"))
bar.render("bar_chart.html") # 保存为HTML文件

链式调用写法(推荐)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
from pyecharts.charts import Bar

bar = (
Bar()
.add_xaxis(["一月", "二月", "三月", "四月", "五月"])
.add_yaxis("销售额", [120, 200, 150, 80, 70])
.add_yaxis("利润", [30, 50, 40, 20, 15])
.set_global_opts(
title_opts=opts.TitleOpts(title="月度业绩"),
toolbox_opts=opts.ToolboxOpts(), # 工具箱
datazoom_opts=opts.DataZoomOpts(), # 缩放
)
)
bar.render("sales_bar.html")

2. 折线图(Line)

1
2
3
4
5
6
7
8
9
10
11
12
from pyecharts.charts import Line

line = (
Line()
.add_xaxis(["周一", "周二", "周三", "周四", "周五", "周六", "周日"])
.add_yaxis("邮件营销", [120, 132, 101, 134, 90, 230, 210],
is_smooth=True) # 平滑曲线
.add_yaxis("联盟广告", [220, 182, 191, 234, 290, 330, 310],
markpoint_opts=opts.MarkPointOpts(data=[opts.MarkPointItem(type_="max")]))
.set_global_opts(title_opts=opts.TitleOpts(title="周流量趋势"))
)
line.render("traffic_line.html")

3. 饼图(Pie)

1
2
3
4
5
6
7
8
9
10
from pyecharts.charts import Pie

pie = (
Pie()
.add("", [list(z) for z in zip(["直接访问", "邮件营销", "联盟广告", "视频广告", "搜索引擎"],
[335, 310, 274, 235, 400])])
.set_global_opts(title_opts=opts.TitleOpts(title="流量来源"))
.set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c} ({d}%)"))
)
pie.render("source_pie.html")

环形图

1
2
3
4
5
6
7
pie = (
Pie()
.add("", [list(z) for z in zip(["A", "B", "C", "D"], [30, 25, 25, 20])],
radius=["40%", "75%"]) # 内半径和外半径
.set_global_opts(title_opts=opts.TitleOpts(title="环形图"))
)
pie.render("donut.html")

4. 地图(Map)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
from pyecharts.charts import Map

# 中国地图
data = [
("广东", 10430.03),
("山东", 9579.31),
("河南", 9402.36),
("四川", 8041.82),
("江苏", 7865.99),
]

map_chart = (
Map()
.add("人口数量", data, "china")
.set_global_opts(
title_opts=opts.TitleOpts(title="中国人口分布"),
visualmap_opts=opts.VisualMapOpts(max_=11000),
)
)
map_chart.render("population_map.html")

5. 组合图表(Grid/Page)

Grid:多图组合

1
2
3
4
5
6
7
8
from pyecharts.charts import Grid

grid = (
Grid()
.add(bar, grid_opts=opts.GridOpts(pos_bottom="60%"))
.add(line, grid_opts=opts.GridOpts(pos_top="60%"))
)
grid.render("grid_chart.html")

Page:多页面

1
2
3
4
5
from pyecharts.charts import Page

page = Page(layout=Page.SimplePageLayout)
page.add(bar, line, pie)
page.render("multi_charts.html")

6. 时间轴(Timeline)

1
2
3
4
5
6
7
8
9
10
11
12
13
from pyecharts.charts import Timeline

timeline = Timeline()
for year in ["2019", "2020", "2021", "2022", "2023"]:
bar = (
Bar()
.add_xaxis(["北京", "上海", "广州", "深圳", "杭州"])
.add_yaxis("GDP", np.random.randint(1000, 5000, 5).tolist())
.set_global_opts(title_opts=opts.TitleOpts(title=f"{year}年GDP"))
)
timeline.add(bar, year)

timeline.render("gdp_timeline.html")

7. 主题样式

1
2
3
4
5
6
7
8
9
10
from pyecharts.globals import ThemeType

# 使用主题
bar = (
Bar(init_opts=opts.InitOpts(theme=ThemeType.DARK)) # 暗黑主题
.add_xaxis(["A", "B", "C", "D"])
.add_yaxis("数值", [10, 20, 30, 40])
)

# 其他主题:LIGHT, MACARONS, VINTAGE, SHINE, WALDEN

实战:销售数据大屏

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
from pyecharts.charts import Bar, Line, Pie, Page
from pyecharts import options as opts
import pandas as pd
import numpy as np

# 模拟数据
months = ["1月", "2月", "3月", "4月", "5月", "6月"]
sales = [120, 150, 180, 140, 200, 220]
profit = [30, 40, 50, 35, 55, 65]
regions = ["华北", "华东", "华南", "西南"]
region_sales = [350, 420, 380, 280]

# 1. 销售额趋势
line = (
Line()
.add_xaxis(months)
.add_yaxis("销售额", sales, is_smooth=True,
markpoint_opts=opts.MarkPointOpts(data=[opts.MarkPointItem(type_="max")]))
.add_yaxis("利润", profit, is_smooth=True)
.set_global_opts(
title_opts=opts.TitleOpts(title="月度业绩趋势"),
toolbox_opts=opts.ToolboxOpts(),
)
)

# 2. 地区占比
pie = (
Pie()
.add("", [list(z) for z in zip(regions, region_sales)],
radius=["40%", "70%"])
.set_global_opts(title_opts=opts.TitleOpts(title="地区销售占比"))
.set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {d}%"))
)

# 3. 产品销量排行
products = ["产品A", "产品B", "产品C", "产品D", "产品E"]
product_sales = [320, 280, 250, 220, 180]

bar = (
Bar()
.add_xaxis(products)
.add_yaxis("销量", product_sales)
.reversal_axis() # 水平条形图
.set_series_opts(label_opts=opts.LabelOpts(position="right"))
.set_global_opts(title_opts=opts.TitleOpts(title="产品销量排行"))
)

# 组合成大屏
page = Page(layout=Page.DraggablePageLayout, page_title="销售数据大屏")
page.add(
line,
pie,
bar,
)
page.render("dashboard.html")

print("数据大屏已生成:dashboard.html")
print("请在浏览器中打开查看")

部署到Web

生成的HTML文件可以直接:

  1. 双击在浏览器中打开
  2. 上传到Web服务器
  3. 嵌入到Flask/Django项目中
1
2
3
4
5
6
7
8
9
10
11
# Flask示例
from flask import Flask, render_template

app = Flask(__name__)

@app.route('/')
def index():
return render_template('dashboard.html')

if __name__ == '__main__':
app.run(debug=True)

性能对比:pyecharts vs 静态图表

特性MatplotlibSeabornpyecharts
交互性丰富(缩放/拖拽/提示)
动画内置
导出格式PNG/PDFPNG/PDFHTML
地图需额外库需额外库内置
数据量百万级十万级万级(推荐)

进阶用法

组合图表(Page和Tab)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
from pyecharts.charts import Bar, Line, Page, Tab
from pyecharts import options as opts

# 多图表页面
bar = Bar().add_xaxis(cities).add_yaxis('销售额', sales)
line = Line().add_xaxis(months).add_yaxis('趋势', trend)

# 方式1:Page(上下排列)
page = Page()
page.add(bar, line)
page.render('report.html')

# 方式2:Tab(标签页切换)
tab = Tab()
tab.add(bar, '销售柱状图')
tab.add(line, '趋势折线图')
tab.render('report_tab.html')

地图可视化

1
2
3
4
5
6
7
8
9
10
11
from pyecharts.charts import Map

# 省级地图
data = [('广东省', 1200), ('北京市', 980), ('上海市', 950), ...]
map_chart = Map()
map_chart.add('销售额', data, 'china')
map_chart.set_global_opts(
title_opts=opts.TitleOpts(title='全国销售分布'),
visualmap_opts=opts.VisualMapOpts(max_=1500)
)
map_chart.render('china_map.html')

避坑指南

❌ 坑1:数据量太大卡顿

1
2
3
4
5
6
7
8
# pyecharts适合万级数据,超过10万点会卡
# 解决方案1:聚合后再画图
daily = df.resample('D').mean() # 聚合到天

# 解决方案2:采样
sample = df.sample(5000)

# 解决方案3:大数据用datashader + 静态图

❌ 坑2:HTML文件打开空白

1
2
3
4
5
6
7
# 需要网络加载echarts.js
# 离线解决方案
from pyecharts.globals import CurrentConfig
CurrentConfig.ONLINE_HOST = '本地echarts路径/'

# 或者确保render路径正确
bar.render('absolute/path/to/chart.html')

实战案例:制作销售分析仪表盘

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
from pyecharts.charts import Bar, Line, Pie, Map, Page
from pyecharts import options as opts
import numpy as np

np.random.seed(42)

# 模拟数据
months = [f'{m}月' for m in range(1, 13)]
sales = [120, 135, 148, 160, 155, 170, 185, 190, 175, 195, 210, 230]
cities = ['北京', '上海', '广州', '深圳', '成都', '杭州']
city_sales = [980, 950, 720, 680, 450, 380]

# 1. 月度趋势
line = Line()
line.add_xaxis(months)
line.add_yaxis('销售额', sales, is_smooth=True,
markpoint_opts=opts.MarkPointOpts(data=[opts.MarkPointItem(type_='max')]))
line.set_global_opts(title_opts=opts.TitleOpts(title='月度销售趋势'))

# 2. 城市排行
bar = Bar()
bar.add_xaxis(cities)
bar.add_yaxis('销售额', city_sales)
bar.set_global_opts(title_opts=opts.TitleOpts(title='城市销售排行'))

# 3. 品类占比
categories = ['电子产品', '服装', '食品', '家居', '美妆']
cat_sales = [450, 380, 320, 280, 210]
pie = Pie()
pie.add('品类', list(zip(categories, cat_sales)), radius=['40%', '70%'])
pie.set_global_opts(title_opts=opts.TitleOpts(title='品类销售占比'))

# 4. 组合仪表盘
page = Page(layout=Page.SimplePageLayout)
page.add(line, bar, pie)
page.render('sales_dashboard.html')

pyecharts配置项详解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
from pyecharts import options as opts
from pyecharts.charts import Bar

bar = Bar()
bar.add_xaxis(['北京', '上海', '广州', '深圳'])
bar.add_yaxis('销售额', [980, 950, 720, 680],
# 系列配置
label_opts=opts.LabelOpts(is_show=True, position='top', formatter='{c}万'),
markpoint_opts=opts.MarkPointOpts(data=[opts.MarkPointItem(type_='max')]),
markline_opts=opts.MarkLineOpts(data=[opts.MarkLineItem(type_='average')]),
itemstyle_opts=opts.ItemStyleOpts(color='#4CAF50'),
)

# 全局配置
bar.set_global_opts(
title_opts=opts.TitleOpts(title='城市销售排行', subtitle='2025年数据'),
xaxis_opts=opts.AxisOpts(name='城市'),
yaxis_opts=opts.AxisOpts(name='销售额(万元)'),
tooltip_opts=opts.TooltipOpts(trigger='axis'),
legend_opts=opts.LegendOpts(is_show=True),
datazoom_opts=[opts.DataZoomOpts()], # 缩放滑块
toolbox_opts=opts.ToolboxOpts(is_show=True), # 工具栏
)

bar.render('chart.html')

pyecharts定时刷新数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 在HTML中添加自动刷新
from pyecharts.charts import Line
from pyecharts import options as opts
from pyecharts.commons.utils import JsCode

line = Line()
line.add_xaxis(x_data)
line.add_yaxis('实时数据', y_data, is_smooth=True)

# 添加自动刷新JS
line.set_global_opts(
title_opts=opts.TitleOpts(title='实时监控'),
)

# 页面meta标签自动刷新
html = line.render_embed()
html = html.replace('<head>', '<head><meta http-equiv="refresh" content="60">')
with open('realtime.html', 'w') as f:
f.write(html)

pyecharts常用图表模板

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
from pyecharts.charts import Bar, Line, Pie, Scatter, Map
from pyecharts import options as opts

# 模板1:带标记的折线图
line = Line()
line.add_xaxis(months)
line.add_yaxis('销售额', sales_data,
is_smooth=True,
markpoint_opts=opts.MarkPointOpts(data=[opts.MarkPointItem(type_='max')]),
markline_opts=opts.MarkLineOpts(data=[opts.MarkLineItem(type_='average')]),
linestyle_opts=opts.LineStyleOpts(width=3),
)

# 模板2:堆叠柱状图
bar = Bar()
bar.add_xaxis(cities)
bar.add_yaxis('线上', online_data, stack='total')
bar.add_yaxis('线下', offline_data, stack='total')
bar.set_global_opts(title_opts=opts.TitleOpts(title='渠道销售对比'))

# 模板3:环形饼图
pie = Pie()
pie.add('', list(zip(labels, values)), radius=['40%', '70%'])
pie.set_global_opts(title_opts=opts.TitleOpts(title='占比分析'))

# 模板4:中国地图
map_chart = Map()
map_chart.add('销量', data_pair, 'china')
map_chart.set_global_opts(visualmap_opts=opts.VisualMapOpts(max_=1000))

pyecharts主题设置

1
2
3
4
5
6
7
8
9
10
11
from pyecharts.globals import ThemeType

# 内置主题
bar = Bar(init_opts=opts.InitOpts(theme=ThemeType.LIGHT)) # 浅色
bar = Bar(init_opts=opts.InitOpts(theme=ThemeType.DARK)) # 深色
bar = Bar(init_opts=opts.InitOpts(theme=ThemeType.CHALK)) # 粉笔
bar = Bar(init_opts=opts.InitOpts(theme=ThemeType.ESSOS)) # 彩色
bar = Bar(init_opts=opts.InitOpts(theme=ThemeType.PURPLE_PASSION)) # 紫色

# 自定义宽度
bar = Bar(init_opts=opts.InitOpts(width='1200px', height='600px'))

下节预告

下一课我们将进入统计分析基础,学习描述性统计和假设检验。

👉 继续阅读:描述性统计-用数字概括数据特征


💬 加入学习交流群

扫码加入Python学习交流群,和数千名同学一起进步:

👉 点击加入交流群

群里不定期分享:

  • 数据分析实战案例
  • Python学习资料
  • 求职面试经验
  • 行业最新动态

推荐:AI Python数据分析实战营

🎁 限时福利:送《利用Python进行数据分析》实体书

👉 点击了解详情


课程导航

上一篇: Pandas内置绘图-最简捷的可视化方式

下一篇: 描述性统计-用数字概括数据特征


PS:Pyecharts是制作数据大屏的神器。掌握它,你的数据分析成果可以高大上地展示出来。



📚 推荐教材

主教材《Excel+Python 飞速搞定数据分析与处理(图灵出品)》

💬 联系我

平台账号/链接
微信扫码加好友
微博@程序员晚枫
知乎@程序员晚枫
抖音@程序员晚枫
小红书@程序员晚枫
B 站Python 自动化办公社区

主营业务:AI 编程培训、企业内训、技术咨询

🎓 AI 编程实战课程

想系统学习 AI 编程?程序员晚枫的 AI 编程实战课 帮你从零上手!