Python | 第十七章 | pyecharts开发图表 | 折线图 | 地图 | 轮播图
P169 pyecharts 基本介绍 2025/3/23
一、基本介绍
- 参考文档1:https://pyecharts.org/#/zh-cn/
- 参考文档2:https://gallery.pyecharts.org/#/README
- 概况:
Echarts
是一个由百度开源的数据可视化技术,凭借着良好的交互性,精巧的图表设计,得到了众多开发者的认可。而Python很适合用于数据处理。当数据分析遇上数据可视化时,pyecharts
诞生了。
- 特性:
- 简洁的API设计,使用如丝滑般流畅,支持链式调用
- 囊括了30+种常见图表,应有尽有
- 支持主流Notebook 环境,Jupyter Notebook和JupyterLab可轻松集成至Flask,Django等主流Web 框架
- 高度灵活的配置项,可轻松搭配出精美的图表详细的文档和示例,帮助开发者更快的上手项目
- 多达400+地图文件以及原生的百度地图,为地理数据可视化提供强有力的支持
二、能做出怎样的图表效果
P170 pyecharts 快速入门 2025/3/23
一、快速入门
-
参考文档:https://pyecharts.org/#/zh-cn/quickstart
-
安装pyecharts:
pip install pyecharts
-
查看版本:
import pyecharts print(pyecharts.__version__)
-
案例代码:
from pyecharts.charts import Bar
bar = Bar()
bar.add_xaxis(["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"])
bar.add_yaxis("商家A", [5, 20, 36, 10, 75, 90])
# render 会生成本地 HTML 文件,默认会在当前目录生成 render.html 文件
# 也可以传入路径参数,如 bar.render("mycharts.html")
bar.render()
pyecharts
所有方法均支持链式调用:
from pyecharts.charts import Bar
bar = (
Bar()
.add_xaxis(["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"])
.add_yaxis("商家A", [5, 20, 36, 10, 75, 90])
.render("myrender2.html")
)
- 后续可以直接参考:https://pyecharts.org/#/zh-cn/quickstart
- 使用标题:
.set_global_opts(title_opts=opts.TitleOpts(title="主标题", subtitle="副标题"))
- 更改主题:
Bar(init_opts=opts.InitOpts(theme=ThemeType.DARK))
P171 pyecharts开发图表 2025/3/24
- 参考文档:https://gallery.pyecharts.org/#/Pie/pie_set_color
# @Author :zjc
# @File :02_pie_sale.py
# @Time :2025/3/24 16:06
from pyecharts import options as opts
from pyecharts.charts import Pie
from pyecharts.faker import Faker
"""
解读:
1. Pie() 创建Pie对象
2. .add("", [list(z) for z in zip(Faker.choose(), Faker.values())])
就是给饼状图添加数据
3. .set_colors(["blue", "green", "yellow", "red", "pink", "orange", "purple"])
设置全局配置项
4. .set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}"))
设置系列配置项
formatter="{b}: {c}" 标签显示的形式为 名称:值
5. .render("pie_sale.html") 生成对应的网页文件 pie_sale.html
"""
data = [['衬衫', 138], ['毛衣', 40], ['领带', 74], ['裤子', 112],
['风衣', 147], ['高跟鞋', 104], ['袜子', 65]];
c = (
Pie()
.add("", data)
.set_colors(["blue", "green", "yellow", "red", "pink", "orange", "purple"])
.set_global_opts(title_opts=opts.TitleOpts(title="Pie-商品销售情况"), toolbox_opts=opts.ToolboxOpts(is_show=True))
.set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}",font_size=12))
.render("pie_sale.html")
)
P172 pyecharts开发折线图 2025/3/2
- 参考文档:https://gallery.pyecharts.org/#/Line/basic_line_chart
- 对北京市,天津市,上海市,重庆市的近20年人口,做出折线图,效果
- 要求从文件分省年度数据.csv读取数据,数据可从 https://data.stats.gov.cn/easyquery.htm获取
- 代码分析:
import pyecharts.options as opts
from pyecharts.charts import Line
# 1. 创建Line对象,折线图对象
line = Line()
# 准备数据
# 打开文件:UnicodeDecodeError: 'utf-8' codec can't decode
# 不能使用utf-8编码
f = open("分省年度数据.csv",mode="r",encoding="gbk")
# 先输出文件的内容
# for line in f:
# print(line,end="")
# f.close()
# 2. 给x轴添加数据
"""
分析:数据就是[2002,2003...2023]
"""
# 读取到所有行数据
line_datas = f.readlines()
# print(line_datas)
f.close() # 数据已经接收到可以关闭了
# 先删除前面三个行(元素)
for _ in range(3):
line_datas.pop(0) # 下标从0开始,循环三次默认从0开始
print("line_datas",line_datas)
# 得到x轴的数据
# 使用.pop(0)得到数据,然后使用.replace将最后一个换行截取掉,.split使用","进行先拆分
x_data_year = line_datas.pop(0).replace("\n","").split(",")
print(x_data_year)
# 将"地区"删除掉
x_data_year.pop(0)
# 此时得到年份数据
print(x_data_year)
# 将年份颠倒,从小到大
x_data_year.reverse()
print(x_data_year)
# 3. 给y轴添加数据
"""
分析:这里头四组数据,分别是北京,上海,天津,重庆20年的的人口数据
"""
print(line_datas) # '北京市,43760.7,41540.9,41045.6,35
# 创建四个列表,存放 北京,上海,天津,重庆20年的的人口数据
y_data_bj = []
y_data_sh = []
y_data_tj = []
y_data_cq = []
# 遍历line_datas得到 北京,上海,天津,重庆20年的的人口数据
for line_data in line_datas:
line_data = line_data.replace("\n","").split(",")
# 不需要第一个元素”北京“,只要后面的数字数据
# print(line_data)
if line_data[0]=="北京市":
line_data.pop(0)
line_data.reverse() # 年份从小进行排序
y_data_bj = line_data
elif line_data[0]=="上海市":
line_data.po
P173 pyecharts开发地图 2025/3/30
- 参考文档:
- 代码案例:
from pyecharts import options as opts
from pyecharts.charts import Map
from pyecharts.faker import Faker
"""准备数据"""
with open("分省年度数据.csv", "r", encoding="gbk") as f:
# 每行作为一个列表,读取完存在列表中
data_lines = f.readlines()
# print(data_lines)
# 删除data_lines列表的前4个元素(行)
for _ in range(4):
# 每次循环删除下标为0的元素(第一个)
data_lines.pop(0)
# 创建一个空的列表,存放地图数
# 分析map_data_list格式 [[省市名,人口数量],[省市名,人口数量]...]
map_data_list = []
for data_line in data_lines:
# 用","号进行分割,然后给到列表map中
data_line_list = data_line.split(",")
# 在某些情况下,数据添加不成功的情况,使用异常处理
try:
map_data_list.append([data_line_list[0], data_line_list[1]])
except Exception as e:
# 如果添加数据到map_data_list中数据异常,我们就continue不去处理出问题的这一行
continue
print("map", map_data_list)
"""创建map对象"""
map = Map()
"""添加数据并配置"""
map.add("2023年各省市的人口分布情况", map_data_list, "china")
# 全局配置
map.set_global_opts(
title_opts=opts.TitleOpts(title="2023年各省市的人口分布情况"),
# VisualMapOpts:视觉映射配置项
visualmap_opts=opts.VisualMapOpts(
# 指定 visualMapPiecewise 组件的最小值。
min_=2000,
# 指定 visualMapPiecewise 组件的最大值。
max_=150000,
# 指定组件位置
pos_left="10%", # 距离左边10%
pos_bottom="50%"
)
)
# 系列配置(标签字体大配置)
map.set_series_opts(label_opts=opts.LabelOpts(font_size=8))
"""生成文件"""
map.render("map_data_list.html")
- 结果图:
P174 pyecharts开发轮播图[1] 2025/3/31
- 对全国2003-2022年各省市的人口,做出动态柱状图/时间线轮播多图,即每隔一定时间间隔,自动的切换显示2003、2004、…、2022各省市的人口(即2003-2022年中国省市人口排名前12的情况),具体如下图:
- 代码部分:已完成对数据添加到字典
# @Author :zjc
# @File :05_timeline_bar_city_population.py
# @Time :2025/3/31 22:12
"""
x = Faker.choose() # ["河马", "蟒蛇", "老虎", "大象", "兔子", "熊猫", "狮子"]
tl = Timeline() # 创建对象
for i in range(2015, 2020): # 循环5次,创建了5个bar柱状图
bar = (
Bar()
.add_xaxis(x) # 添加x轴数据
.add_yaxis("商家A", Faker.values()) # 添加y轴数据,[值1,值2]
.add_yaxis("商家B", Faker.values())
.set_global_opts(title_opts=opts.TitleOpts("某商店{}年营业额".format(i)))
)
tl.add(bar, "{}年".format(i))
tl.render("timeline_bar.html")
"""
from pyecharts import options as opts
from pyecharts.charts import Bar, Timeline
from pyecharts.faker import Faker
"""准备数据"""
# 确定需要创建多少Bar对象,根据文件提供的年份 2015-2023
with open("分省年度数据.csv","r",encoding="gbk") as f:
data_lines = f.readlines()
# 删除data_lines列表前三个元素,顺便替换掉\n
for _ in range(3):
data_lines.pop(0)
# 删除data_lines最后一个元素
data_lines.pop(-1)
# 取出第一个元素(年份数据)
years = data_lines.pop(0).replace("\n","").split(",")
# 去掉地区这个元素"地区"
years.pop(0)
# 此时数据:['2023年', '2022年', '2021年', '2020年', '2019年', '2018年', '2017年', '2016年', '2015年']
# 遍历 data_lines 生成我们需要的数据
# 难度-需要我们设计一些
# 把数据放在一个字典对象中 data_dict = {年份:[[省市名,人口数],[省市名,人口数]...]}
# 具体案例:{2003:[["北京市",2184],["天津市",2184]],2004:[["北京市",1184],["天津市",2884]]}
# 创建字典对象
data_dict = {}
for data_line in data_lines:
data_line_list = data_line.replace("\n","").split(",")
# 数据:['北京市', '43760.7', '41540.9', '41045.6
# print(data_line_list)
# 遍历years给各个城市的各个年份的人口数据添加到data_dict
index = 0
for year in years:
index += 1
try:
# 将每个年份作为字典的键"key",
data_dict[year].append([data_line_list[0],data_line_list[index]])
except Exception as e:
# 如果出现了异常,说明是第一次添加数据
# 那就将第一个 key 创建起来,值为空;继续添加
data_dict[year] = []
data_dict[year].append([data_line_list[0], data_line_list[index]])
print(data_dict)
"""创建Timeline对象"""
"""创建Bar对象 并加入到Timeline 还有进行配置"""
"""生成对应的文件"""
P175 pyecharts开发轮播图[2] 2025/4/1
- 结果展示:
- 最终代码:
# @Author :zjc
# @File :05_timeline_bar_city_population.py
# @Time :2025/3/31 22:12
"""
x = Faker.choose() # ["河马", "蟒蛇", "老虎", "大象", "兔子", "熊猫", "狮子"]
tl = Timeline() # 创建对象
for i in range(2015, 2020): # 循环5次,创建了5个bar柱状图
bar = (
Bar()
.add_xaxis(x) # 添加x轴数据
.add_yaxis("商家A", Faker.values()) # 添加y轴数据,[值1,值2]
.add_yaxis("商家B", Faker.values())
.set_global_opts(title_opts=opts.TitleOpts("某商店{}年营业额".format(i)))
)
tl.add(bar, "{}年".format(i))
tl.render("timeline_bar.html")
"""
from pyecharts import options as opts
from pyecharts.charts import Bar, Timeline
from pyecharts.faker import Faker
from pyecharts.globals import ThemeType
"""准备数据"""
# 确定需要创建多少Bar对象,根据文件提供的年份 2015-2023
with open("分省年度数据.csv", "r", encoding="gbk") as f:
data_lines = f.readlines()
# 删除data_lines列表前三个元素,顺便替换掉\n
for _ in range(3):
data_lines.pop(0)
# 删除data_lines最后一个元素
data_lines.pop(-1)
# 取出第一个元素(年份数据)
years = data_lines.pop(0).replace("\n", "").split(",")
# 去掉地区这个元素"地区"
years.pop(0)
# 此时数据:['2023年', '2022年', '2021年', '2020年', '2019年', '2018年', '2017年', '2016年', '2015年']
# 遍历 data_lines 生成我们需要的数据
# 难度-需要我们设计一些
# 把数据放在一个字典对象中 data_dict = {年份:[[省市名,人口数],[省市名,人口数]...]}
# 具体案例:{2003:[["北京市",2184],["天津市",2184]],2004:[["北京市",1184],["天津市",2884]]}
# 创建字典对象
data_dict = {}
for data_line in data_lines:
data_line_list = data_line.replace("\n", "").split(",")
# 数据:['北京市', '43760.7', '41540.9', '41045.6
# print(data_line_list)
# 遍历years给各个城市的各个年份的人口数据添加到data_dict
index = 0
for year in years:
index += 1
try:
# 将每个年份作为字典的键"key",
data_dict[year].append([data_line_list[0], float(data_line_list[index])])
except Exception as e:
# 如果出现了异常,说明是第一次添加数据
# 那就将第一个 key 创建起来,值为空;继续添加
data_dict[year] = []
data_dict[year].append([data_line_list[0], float(data_line_list[index])])
"""创建Timeline对象"""
timeline = Timeline({"theme":ThemeType.ESSOS})
years.reverse()
"""创建Bar对象 并加入到Timeline对象 还有进行配置"""
for year in years:
# 下面我们需要取出每一年按照人口数量排序的前12省市
# 1. 先排序 2.在切片
# 采用人口数量进行排序,所以索引对应的为1,(适用于列表中的元素还是列表的情况)
data_dict[year].sort(key=lambda ele: ele[1], reverse=True)
rank_12_city_data = data_dict[year][0:12] # 只切片12个省市
# print(year,rank_12_city_data)
# rank_12_city_data:[['广东省', 74732.4], ['江苏省', 71255.9], ['山东省', 55288.8]
# 定义Bar的x轴数据
x_data = []
# 定义Bar的x轴数据
y_data = []
for city in rank_12_city_data:
x_data.append(city[0]) # 对应各省市名称
y_data.append(city[1]) # 对应的人口数量
# 创建Bar对象
bar = Bar()
# 对x_data和y_data数据进行翻转
x_data.reverse()
y_data.reverse()
bar.add_xaxis(x_data)
bar.add_yaxis("人口(万)", y_data)
# 转换x轴和y轴
bar.reversal_axis()
# 全局设置
bar.set_global_opts(title_opts=opts.TitleOpts(title=f"{year}年中国前12省市情况"))
# 将创建好的bar添加到Timeline对象
timeline.add(bar, str(year))
# 对时间线进行配置
timeline.add_schema(
play_interval=500, # 毫秒单位,半秒
is_auto_play=True
)
"""生成对应的文件"""
timeline.render("2015-2023排名前十二省市情况.html")