欢迎光临
我们一直在努力

Day 08 · Pyecharts 入门:可交互的中文图表

「AI Python 系列」第 02 栏 · AI+数据可视化 全栏 15 篇 · 零成本跟完 🍃 作者:梅雅达编程笔记 首发:CSDN


摘要: Matplotlib 和 Seaborn 画的图是静态的——不能缩放、不能交互。Pyecharts 基于百度 ECharts,天生支持中文,画出来的图表可以在浏览器里交互:鼠标悬停显示数据、缩放查看细节、点击切换系列。本篇从零开始学 Pyecharts:安装配置、柱状图、折线图、饼图、散点图,每种都给出完整可运行代码。


前面学的 matplotlib 和 seaborn 画的图都是静态图片。

但很多场景你需要交互:

  • 老板看报表,想鼠标悬停看具体数值
  • 数据点多,想缩放看局部细节
  • 多个系列,想点击切换显示/隐藏

Pyecharts 就是为了解决这些问题。它基于百度开源的 ECharts,天然支持中文,而且语法非常简单。


一、安装和基本用法

pip install pyecharts

Pyecharts 的核心思想是链式调用:

from pyecharts.charts import Bar

bar = (
Bar()
.add_xaxis(['1月', '2月', '3月', '4月', '5月', '6月'])
.add_yaxis('销售额', [12.3, 10.1, 15.8, 14.2, 18.6, 22.1])
.set_global_opts(title_opts={'title': '月度销售趋势'})
)

bar.render('sales_bar.html') # 生成 HTML 文件

打开 sales_bar.html,你就能在浏览器里看到一个可以交互的柱状图。鼠标悬停会显示具体数值,工具栏里有保存图片、数据视图、切换缩放等功能。

在这里插入图片描述

💡 Pyecharts 的图表都是 HTML 文件。render() 生成文件,在 Jupyter 里也可以用 render_notebook() 直接内嵌显示。

二、基础图表

2.1 柱状图

from pyecharts.charts import Bar
from pyecharts import options as opts

products = ['商品A', '商品B', '商品C', '商品D']
sales = [320, 280, 195, 205]

bar = (
Bar()
.add_xaxis(products)
.add_yaxis('销量', sales,
itemstyle_opts=opts.ItemStyleOpts(color='#2196F3'))
.set_global_opts(
title_opts=opts.TitleOpts(title='各商品销量对比'),
tooltip_opts=opts.TooltipOpts(trigger='axis'),
toolbox_opts=opts.ToolboxOpts(is_show=True),
)
.set_series_opts(label_opts=opts.LabelOpts(is_show=True)) # 显示数据标签
)

bar.render('bar_basic.html')

在这里插入图片描述

分组柱状图:

bar = (
Bar()
.add_xaxis(['商品A', '商品B', '商品C', '商品D'])
.add_yaxis('线上', [180, 150, 100, 110], category_gap='30%')
.add_yaxis('线下', [100, 90, 65, 70])
.add_yaxis('分销', [40, 40, 30, 25])
.set_global_opts(
title_opts=opts.TitleOpts(title='各商品分渠道销量'),
tooltip_opts=opts.TooltipOpts(trigger='axis'),
)
)
bar.render('bar_group.html')

在这里插入图片描述

只需要多次 add_yaxis 就能叠加系列。

2.2 折线图

from pyecharts.charts import Line

months = ['1月', '2月', '3月', '4月', '5月', '6月',
'7月', '8月', '9月', '10月', '11月', '12月']
sales = [12.3, 10.1, 15.8, 14.2, 18.6, 22.1,
19.5, 24.3, 21.7, 26.8, 30.2, 35.5]

line = (
Line()
.add_xaxis(months)
.add_yaxis('销售额', sales,
is_smooth=True, # 平滑曲线
areastyle_opts=opts.AreaStyleOpts(opacity=0.3), # 面积填充
label_opts=opts.LabelOpts(is_show=False),
itemstyle_opts=opts.ItemStyleOpts(color='#2196F3'))
.set_global_opts(
title_opts=opts.TitleOpts(title='全年销售趋势'),
tooltip_opts=opts.TooltipOpts(trigger='axis'),
xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=30)),
)
)
line.render('line_smooth.html')

在这里插入图片描述

关键参数:

  • is_smooth=True:画平滑曲线而不是折线
  • areastyle_opts:面积图填充,透明度 0.3
  • xaxis_opts 里的 rotate=30:X 轴标签旋转 30° 防止重叠

2.3 饼图

from pyecharts.charts import Pie

data = [('线上', 55), ('线下', 30), ('分销', 15)]

pie = (
Pie()
.add('', data,
radius=['40%', '70%'], # 环形图(留空就是实心饼图)
label_opts=opts.LabelOpts(formatter='{b}: {c} ({d}%)'))
.set_global_opts(
title_opts=opts.TitleOpts(title='销售渠道占比'),
legend_opts=opts.LegendOpts(orient='vertical', pos_left='left'),
)
.set_colors(['#2196F3', '#FF5722', '#4CAF50'])
)
pie.render('pie_donut.html')

在这里插入图片描述

radius=['40%', '70%'] 画出来的是环形图。想画实心饼图就去掉这个参数。

formatter='{b}: {c} ({d}%)' 表示显示"名称: 数值 (百分比)"。

2.4 散点图

from pyecharts.charts import Scatter

prices = [59, 79, 99, 129, 159, 199, 249, 299]
volumes = [420, 350, 280, 180, 120, 85, 45, 20]

scatter = (
Scatter()
.add_xaxis(prices)
.add_yaxis('销量', volumes,
symbol_size=15, # 点的大小
itemstyle_opts=opts.ItemStyleOpts(color='#2196F3'))
.set_global_opts(
title_opts=opts.TitleOpts(title='价格 vs 销量'),
xaxis_opts=opts.AxisOpts(name='价格(元)'),
yaxis_opts=opts.AxisOpts(name='销量(件)'),
tooltip_opts=opts.TooltipOpts(formatter='{c[0]}元 → {c[1]}件'),
)
)
scatter.render('scatter.html')

在这里插入图片描述


三、Jupyter Notebook 中使用

如果你在用 Jupyter,不需要 render() 生成文件,直接内嵌显示:

from pyecharts.charts import Bar
from pyecharts import options as opts
from pyecharts.globals import RenderType, ThemeType

# 关键:设置渲染类型为 notebook
bar = (
Bar()
.add_xaxis(['A', 'B', 'C'])
.add_yaxis('销量', [10, 20, 30])
.set_global_opts(title_opts=opts.TitleOpts(title='Jupyter 内嵌图'))
)

bar.render_notebook() # 注意是 render_notebook()

在这里插入图片描述

这样图表就会直接显示在 Notebook 的输出单元格里。


四、主题和全局配置

Pyecharts 内置了多种主题:

from pyecharts.globals import ThemeType

bar = (
Bar(init_opts=opts.InitOpts(theme=ThemeType.DARK)) # 暗色主题
.add_xaxis(['A', 'B', 'C'])
.add_yaxis('销量', [10, 20, 30])
)

常用主题:LIGHT(默认)、DARK、WHITE、MACARONS(马卡龙色)、ROMA(罗马风)。

常用全局配置

from pyecharts import options as opts

chart = (
Bar()
.add_xaxis(x_data)
.add_yaxis('系列名', y_data)
.set_global_opts(
# 标题
title_opts=opts.TitleOpts(title='主标题', subtitle='副标题'),

# 提示框(鼠标悬停时显示)
tooltip_opts=opts.TooltipOpts(
trigger='axis', # 'item' 或 'axis'
axis_pointer_type='cross' # 十字准线
),

# 工具箱(右上角那些按钮)
toolbox_opts=opts.ToolboxOpts(
is_show=True,
pos_right='5%'
),

# 图例
legend_opts=opts.LegendOpts(
is_show=True,
pos_top='10%',
orient='horizontal'
),

# 数据区域缩放
datazoom_opts=[
opts.DataZoomOpts(type_='slider', range_start=0, range_end=100),
opts.DataZoomOpts(type_='inside'), # 鼠标滚轮缩放
],

# 视觉映射(颜色映射)
visualmap_opts=opts.VisualMapOpts(
is_show=True,
max_=100,
min_=0,
orient='horizontal',
pos_bottom='0%'
),
)
)


五、数据区域缩放:数据多时的救星

当你有 100 个数据点,不可能一次全看清。Pyecharts 的 DataZoom 组件完美解决这个问题:

import random

months = [f'{i}月' for i in range(1, 25)]
sales = [random.randint(10, 50) for _ in range(24)]

line = (
Line()
.add_xaxis(months)
.add_yaxis('销售额', sales, is_smooth=True)
.set_global_opts(
title_opts=opts.TitleOpts(title='24个月销售趋势'),
# 底部滑动条缩放
datazoom_opts=[
opts.DataZoomOpts(type_='slider', range_start=0, range_end=50),
# 鼠标滚轮/触摸缩放
opts.DataZoomOpts(type_='inside'),
],
tooltip_opts=opts.TooltipOpts(trigger='axis'),
)
)
line.render('line_datazoom.html')

在这里插入图片描述

生成的图底部会有一个滑块,拖动它就能看到不同时间段的细节。鼠标滚轮也能缩放。 在这里插入图片描述


六、Pyecharts vs Matplotlib 对比

特性Matplotlib Pyecharts
输出格式 静态图片 (PNG/SVG) HTML 交互页面
中文支持 需手动配置字体 天然支持
交互性 悬停、缩放、切换
学习曲线 API 多,较陡 链式调用,简单
统计图表 Seaborn 配合 不如 Seaborn 丰富
适合场景 论文、报告、打印 Web 展示、仪表盘

不是替代关系,是互补关系。 需要好看的静态图 → matplotlib/seaborn;需要交互展示 → pyecharts。


七、小结

Pyecharts 的核心优势就三个字:交互式。

关键 API 速查:

图表类名核心方法
柱状图 Bar() add_xaxis() + add_yaxis()
折线图 Line() is_smooth=True 平滑曲线
饼图 Pie() radius 控制环形/实心
散点图 Scatter() symbol_size 控制点大小
通用 .set_global_opts() 标题/提示框/工具箱/缩放
通用 .set_series_opts() 数据标签/样式

记住两件事:

  • 链式调用:.add_xaxis().add_yaxis().set_global_opts().render()
  • Jupyter 用 render_notebook(),独立脚本用 render()
  • 下一篇讲 Pyecharts 的进阶功能——地图、时间线、组合图表。


    下期预告: Day 09 Pyecharts 进阶——用 Pyecharts 画中国地图、时间轮播图、多图表组合仪表盘。

    往期回顾

    Day 01 · 数据可视化到底在干啥?为什么 AI 让它变简单了

    Day 02:环境搭建 Python 数据分析零成本工具包

    Day 03 · Pandas 快速上手:读取、清洗、整理数据 文章已被快递鸟社区收录

    Day 04 · 数据清洗:缺失值、异常值、重复值一站式处理

    Day 05 · Matplotlib 基础:折线图、柱状图、饼图、散点图

    Day 06 · 图表美化:配色、标注、子图布局、中文显示

    Day 07 · Seaborn 进阶:统计图表一行代码搞定


    专栏

    -「AI Python 系列」第 02 栏 ·AI+数据可视化(连载中) -「AI Python 系列」第 01 栏 · AI+自动化办公(连载中) -「AI Python 系列」第 03 栏 · Python 爬虫实战(连载中)

    资源领取

    • 关注作者获取本栏完整代码和数据集

    原创声明:本文为梅雅达编程笔记原创作品,未经允许不得转载。

    赞(0)
    未经允许不得转载:171主机测评 » Day 08 · Pyecharts 入门:可交互的中文图表
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址