数据处理
📖 阅读信息
阅读时间:3 分钟 | 中文字符:1059 | 有效代码行数:367
数据可视化部分
案例介绍
- 疫情的地图
- 动态的 GDP 的图像
我们使用的技术是 Echart 的开源的可视化,我们需要在环境中安装包
json 数据格式
什么是 json
两种数据的相互转换
- 相互转换
- 将字典、列表转换为 JSON代码:
json.dumps(data)
| Python |
|---|
| import json
# 准备一个转化为json的列表
data=[{"name":"张三","age":13},{"name":"大锤","age":23},{"name":"小胡","age":43}]
json_str=json.dumps(data)
print(type(json_str))
print(json_str)
|
但是现在输出的中文是乱码,所以需要加上这么一句:json_str=json.dumps(data,ensure_ascii=False)(代表不适用 ascii 码表示中文)
输出:
| Python |
|---|
| <class 'str'>
[{"name": "张三", "age": 13}, {"name": "大锤", "age": 23}, {"name": "小胡", "age": 43}]
|
同样,使用字典时也是可以的
- 反之,将字符串还原为字典或者列表:
json.loads(s)
| Python |
|---|
| s='[{"name": "张三", "age": 13}, {"name": "大锤", "age": 23}, {"name": "小胡", "age": 43}]'
l=json.loads(s)
print(type(l))
print(l)
s_2='{"name": "小明", "add": "台湾"}'
l_2=json.loads(s_2)
print(l_2)
print(type(l_2))
|
pyecharts 模块介绍
Echart 为百度开源的,在 python 上的就是pyecharts
官方网站:pyecharts.org
https://gallery.pyecharts.org/ 这个是画廊,在这里可以看见很多图表的代码和预览图

类似上面的曲线
安装这个模块
在 cmd 中使用这个进行安装:pip install pyecharts (最好是在 pycharm 中的终端中直接安装,就在对应的环境中安装了)
快速入门
构建基础的折线图
- 先导包
- 创建折线图的对象
- 添加 x 轴数据和 y 轴数据
| Python |
|---|
| import pyecharts
# 导包
from pyecharts.charts import Line
# 得到折线图对象
line=Line()
# 添加x轴数据
line.add_xaxis(["中国","美国","英国"])
# 添加y轴数据
line.add_yaxis("GDP",[30,20,10])
# 生成图表
# 通过render方法实现生成图像
line.render()
|
最后就在文件夹中生成了 render. html 文件,在 pycharm 中使用浏览器打开即可
- 有很多的配置的选项
- 全局配置
使用 set_global_opts 方法来配置(在上述网站中的全局配置项中) - 系列设置
增加下面的代码进行全局的配置:
| Python |
|---|
| # 设置全局配置项
from pyecharts.options import TitleOpts,LegendOpts,ToolboxOpts,VisualMapOpts
line.set_global_opts(
title_opts=TitleOpts(title="GDP展示",pos_left="center",pos_bottom="1%"),# 使用关键字传参,标题与位置
legend_opts=LegendOpts(is_show=True),
toolbox_opts=ToolboxOpts(is_show=True), # 工具栏
visualmap_opts=VisualMapOpts(is_show=True) # 鼠标移动的效果
)
# 通过render方法实现生成图像
line.render()
|
数据处理
通过 json 模块
我们现在使用的是折线图数据的文件夹
前面有一段不符合规范的内容
怎么看这一段 json 文件呢?
我们需要打开 bejson 网站
- 如图所示,多层的列表[]、字典{}的嵌套

| Python |
|---|
| import json
# 处理数据
f_us=open("D:/美国.txt","r",encoding="UTF-8")
us_data=f_us.read()# 读取全部的内容
# 去除不符合json规范的开头
us_data=us_data.replace("jsonp_1629344292311_69436(", "")
# 去除不符合的结尾
us_data=us_data[0:-2:1]# 切取一部分
# 转为python字典
us_dict=json.loads(us_data)
print(type(us_dict))
print(us_dict)
# 获取日期数据,作为x轴
trend_data=us_dict['data'][0]['trend']
print(trend_data)
x_data=trend_data['updateDate'][:314]
print(x_data)
# 获取确诊数据,作为y轴
y_data=trend_data['list'][0]['data'][:314]
print(y_data)
|
以上就是代码,总之就是看看自己想要的数据在哪里,然后一层一层取(字典、列表)
生成折线图
类似美国的数据,生成另外两个国家的数据:
| Python |
|---|
| import json
from pyecharts.charts import Line
from pyecharts.options import TitleOpts,LegendOpts,ToolboxOpts,VisualMapOpts,LabelOpts
# 处理数据
f_us=open("D:/美国.txt","r",encoding="UTF-8")
us_data=f_us.read()# 读取全部的内容
f_jp=open("D:/日本.txt","r",encoding="UTF-8")
jp_data=f_jp.read()# 读取全部的内容
f_in=open("D:/印度.txt","r",encoding="UTF-8")
in_data=f_in.read()# 读取全部的内容
# 去除不符合json规范的开头
us_data=us_data.replace("jsonp_1629344292311_69436(", "")
jp_data=jp_data.replace("jsonp_1629350871167_29498(","")
in_data=in_data.replace("jsonp_1629350745930_63180(","")
# 去除不符合的结尾
us_data=us_data[0:-2:1]# 切取一部分
jp_data=jp_data[:-2]
in_data=in_data[:-2]
# 转为python字典
us_dict=json.loads(us_data)
jp_dict=json.loads(jp_data)
in_dict=json.loads(in_data)
# 获取日期数据,作为x轴
us_trend_data=us_dict['data'][0]['trend']
jp_trend_data=jp_dict['data'][0]['trend']
in_trend_data=in_dict['data'][0]['trend']
us_x_data=us_trend_data['updateDate'][:314]
jp_x_data=jp_trend_data['updateDate'][:314]
in_x_data=in_trend_data['updateDate'][:314]
# 获取确诊数据,作为y轴
us_y_data=us_trend_data['list'][0]['data'][:314]
jp_y_data=jp_trend_data['list'][0]['data'][:314]
in_y_data=in_trend_data['list'][0]['data'][:314]
# 生成图表
line=Line()
# 添加x轴数据
line.add_xaxis(us_x_data)# x轴是共用的
# 添加y轴的数据
line.add_yaxis("美国",us_y_data,label_opts=LabelOpts(is_show=False))# 就不显示具体的数字了
line.add_yaxis("日本",jp_y_data,label_opts=LabelOpts(is_show=False))
line.add_yaxis("印度",in_y_data,label_opts=LabelOpts(is_show=False))
# 设置简单的全局选项
line.set_global_opts(
title_opts=TitleOpts(title="疫情的感染人数",pos_left="center",pos_bottom="1%"),# 使用关键字传参
legend_opts=LegendOpts(is_show=True),
toolbox_opts=ToolboxOpts(is_show=True),
visualmap_opts=VisualMapOpts(is_show=True)
)
# 调用生成图表
line.render()
# 关闭文件夹
f_us.close()
f_jp.close()
f_in.close()
|
地图可视化
基础地图的应用
使用的构建的对象为map
| Python |
|---|
| from pyecharts.charts import Map
from pyecharts.options import VisualMapOpts
# 准备地图对象
map=Map()
# 准备数据(元组的形式
data=[
("北京市",99),
("上海市",199),
("湖南省",299),
("台湾省",399),
("广东省",499),
]
map.add("测试地图",data,"china")
# 设置全局选项
map.set_global_opts(
visualmap_opts=VisualMapOpts(
is_show=True,
is_piecewise=True,
pieces=[
{"min":1,"max":9,"label":"1-9","color":"#CCFFFF"},
{"min":10,"max":99,"label":"10-99","color":"#FF6666"},
{"min":100,"max":500,"label":"100-500","color":"#990033"}# 这里的代码是颜色对应的RGB代码
]
)
)
# 绘图
map.render("2.html")
|
国内的疫情地图
同样,将我们的 json 文件在浏览器中打开
下面就是层级:
| Python |
|---|
| from pyecharts.charts import Map
from pyecharts.options import * # 所有都导进来
import json
from pyecharts.types import Title
# 读取文件
f=open("D:/疫情.txt","r",encoding="UTF-8")
data=f.read()
f.close()
print(type(data))
# 取得各个省的数据
# 将字符串json转换为python的字典
data_dict=json.loads(data)
pro_data_list=data_dict["areaTree"][0]["children"]# 现在就是各个省的数据列表了
# 组装各个省份和确诊人数为元组,把各个省的数据都封装在列表中
data_list=[]# 所需要的列表
for i in pro_data_list:# 遍历列表,组装为元组
if i["name"]=="北京" or i["name"]=="上海" or i["name"]=="天津" or i["name"]=="重庆":
pro_name=i["name"]+"市"# 省份的名称
else:
pro_name = i["name"] + "省" # 省份的名称
pro_confirm=i["total"]["confirm"]# 确证的人数
data_list.append((pro_name,pro_confirm))# 将元组添加到列表中
print(data_list)
# 创建地图对象
map=Map()
# 添加数据
map.add("各个省份的确诊人数",data_list,"china")
# 设置全局配置
map.set_global_opts(
title_opts=TitleOpts(title="全国疫情地图"),
visualmap_opts=VisualMapOpts(
is_show=True,
is_piecewise=True,
pieces=[
{"min":1,"max":99,"label":"1-9","color":"#CCFFFF"},
{"min":100,"max":999,"label":"100-999","color":"#FFFF99"},
{"min":1000,"max":4999,"label":"1000-4999","color":"#FF9966"} ,# 这里的代码是颜色对应的RGB代码
{"min":5000,"max":9999,"label":"5000-9999","color":"#FF6666"} ,# 这里的代码是颜色对应的RGB代码
{"min":10000,"max":99999,"label":"10000-99999","color":"#CC3333"},# 这里的代码是颜色对应的RGB代码
{"min":100000,"label":"100000-","color":"#990033"}# 这里的代码是颜色对应的RGB代码
]
)
)
# 绘图
map.render("疫情.html")
|
- 首先对数据进行的处理
- 打开文件,读取、关闭
- 转换为字典对象
- 拿到每个省份的,对列表进行遍历,写成元组的形式
- 全局设置
- 标题的设置
- 图例的显示和颜色的设置
- 绘图

省级疫情地图的绘制

上述就是省级的层级(在上面的全国的基础上)
| Python |
|---|
| from pyecharts.charts import Map
from pyecharts.options import * # 所有都导进来
import json
from pyecharts.types import Title
# 读取文件
f=open("D:/疫情.txt","r",encoding="UTF-8")
data=f.read()
f.close()
print(type(data))
# 取得各个省的数据
# 将字符串json转换为python的字典
data_dict=json.loads(data)
pro_data_list=data_dict["areaTree"][0]["children"][3]["children"]# 现在就是各个市的数据列表了
data_list=[]
for i in pro_data_list:
city_name=i["name"]+"市"
city_confirm=i["total"]["confirm"]
data_list.append((city_name,city_confirm))
print(data_list)
# 构建地图对象
map=Map()
map.add("河南省疫情分布",data_list,"河南")
# 设置全局的选项
map.set_global_opts(
title_opts=TitleOpts(title="河南疫情地图"),
visualmap_opts=VisualMapOpts(
is_show=True,
is_piecewise=True,
pieces=[
{"min":1,"max":99,"label":"1-9","color":"#CCFFFF"},
{"min":100,"max":999,"label":"100-999","color":"#FFFF99"},
{"min":1000,"max":4999,"label":"1000-4999","color":"#FF9966"} ,# 这里的代码是颜色对应的RGB代码
{"min":5000,"max":9999,"label":"5000-9999","color":"#FF6666"} ,# 这里的代码是颜色对应的RGB代码
{"min":10000,"max":99999,"label":"10000-99999","color":"#CC3333"},# 这里的代码是颜色对应的RGB代码
{"min":100000,"label":"100000-","color":"#990033"}# 这里的代码是颜色对应的RGB代码
]
)
)
#绘制
map.render("河南省疫情地图.html")
|
title_opts=TitleOpts(title="河南疫情地图") 这种写法的含义是什么
动态柱状图的绘制
基础柱状图
学习之后,我们可以绘制基础的柱状图
| Python |
|---|
| from pyecharts.charts import Bar
from pyecharts.options import * # 所有具体的功能都导进来
# 使用Bar构建基础柱状图
bar=Bar()
# 添加x轴的数据
bar.add_xaxis(["中国","美国","英国"])
# 添加y轴的数据
bar.add_yaxis(
"GDP",[30,20,10],label_opts=LabelOpts(position="right")
)# 将数值的标签放到右边
# 绘制
# 反转两个轴
bar.reversal_axis()
bar.render("GDP.html")
|
基础时间线柱状图的绘制
基础的时间线配置动态图表
就是一个从左往右的时间轴,在点 1 的时候提供一个图表,在点 2 的时候提供一个图表(就是一直切换柱状图表)
需要新导入from pyecharts.charts import Bar,Timeline
| Python |
|---|
| from pyecharts.charts import Bar,Timeline
from pyecharts.options import * # 所有都导进来
# 使用Bar构建基础柱状图
bar1=Bar()
# 添加x轴的数据
bar1.add_xaxis(["中国","美国","英国"])
# 添加y轴的数据
bar1.add_yaxis(
"GDP",[30,20,10],label_opts=LabelOpts(position="right")
)# 将数值的标签放到右边
bar1.reversal_axis()
bar2=Bar()
# 添加x轴的数据
bar2.add_xaxis(["中国","美国","英国"])
# 添加y轴的数据
bar2.add_yaxis(
"GDP",[50,50,50],label_opts=LabelOpts(position="right")
)# 将数值的标签放到右边
bar2.reversal_axis()
bar3=Bar()
# 添加x轴的数据
bar3.add_xaxis(["中国","美国","英国"])
# 添加y轴的数据
bar3.add_yaxis(
"GDP",[70,60,60],label_opts=LabelOpts(position="right")
)# 将数值的标签放到右边
bar3.reversal_axis()
# 构建时间线对象
timeline=Timeline()
# 在时间线对象中添加柱状图对象
timeline.add(bar1,"点1")
timeline.add(bar2,"点2")
timeline.add(bar3,"点3")
# 绘图是使用时间线对象绘图,不是使用bar对象绘图
timeline.render("基础时间线柱状图.html")
|

以上就是生成的结果,那么如何让时间能够自动播放
| Python |
|---|
| # 自动播放
timeline.add_schema(
play_interval=1000,# 自动播放的时间,单位ms
is_timeline_show=True,# 是否在自动播放的时候显示时间线
is_auto_play=True,# 是否自动播放
is_loop_play=True# 是否自动循环播放
)
|
在绘图前加上这个就行 掌握设置主题修改颜色样式
时间线设置主题
from pyecharts.globals import ThemeType
在构建时间线对象中加入
| Python |
|---|
| # 构建时间线对象
timeline=Timeline(
{"theme":ThemeType.LIGHT}
)
|
GDP 动态柱状图的绘制
完成列表的排序
我们使用 sort 的方法进行能够指定排序规则的排序
使用方法:
列表. sort (key=, reverse=)
- key:要求传入一个函数(函数的传入自变量为列表的元素),将列表的每一个元素都传入函数中,返回排序的依据
- 参数 reverse,是否反转排序的结果
| Python |
|---|
| my_list=["a",33],['b',55],['c',11]("a",33],['b',55],['c',11.md){#e2dd4979bc3f4613089ce89bc6290b99}
# 基于带名函数进行排序
def choose_sort_key(element):
return element[1]
my_list.sort(key=choose_sort_key,reverse=True)
print(my_list)
|
或者直接使用 lambda 函数
| Python |
|---|
| my_list=["a",33],['b',55],['c',11]("a",33],['b',55],['c',11.md){#e2dd4979bc3f4613089ce89bc6290b99}
# 基于带名函数进行排序
# def choose_sort_key(element):
# return element[1]
# my_list.sort(key=choose_sort_key,reverse=True)
my_list.sort(key=lambda element:element[1],reverse=True)
print(my_list)
|
完成图表所需的数据处理和数据图的绘制
我们需要对结果进行排序,取到前八名
我们使用记事本打开文件,逗号分开的就是不同的列
| Python |
|---|
| #
# my_list=["a",33],['b',55],['c',11]("a",33],['b',55],['c',11.md){#e2dd4979bc3f4613089ce89bc6290b99}
# # 基于带名函数进行排序
# # def choose_sort_key(element):
# # return element[1]
# # my_list.sort(key=choose_sort_key,reverse=True)
# my_list.sort(key=lambda element:element[1],reverse=True)
# print(my_list)
from cProfile import label
from pyecharts.charts import Bar,Timeline
from pyecharts.options import * # 所有都导进来
from pyecharts.globals import ThemeType
from 基础柱状图 import timeline
# 读取文件
f=open("D:/1960-2019全球GDP数据.csv","r",encoding="GB2312")
data_line=f.readlines()
# 删除第一条数据
data_line.pop(0)
# print(data_line)# 此时输出的是列表,每个元素是由一行组成的字符串['1960,美国,5.433E+11\n', '1960,英国,73233967692\n',……
# 将数据转化为字典储存,格式为:
# {年份:[国家,gdp]……,[[国家],[gdp](国家,gdp]……,[[国家],[gdp.md){#cabcb6117dc9bb4861afd3c7e9ff60b5}……}
# 先定义一个字典的对象
data_dict={}
for i in data_line:
year=int(i.split(",")[0])# 年份(使用函数分割,转换为int
country=i.split(",")[1]# 国家
gdp=float(i.split(",")[2])# gdp数据
# 如何判断字典中有没有指定的key(使用异常的捕获的形式
try:
data_dict[year].append([country,gdp])
except KeyError:
data_dict[year]=[]
data_dict[year].append([country,gdp])
print(data_dict)# 此时的初始结果就是我们想要的字典的形式了
# 循环我们的字典,每一年都构建一个对象
# 先排序年份
print(data_dict.keys())
s_data_dict=sorted(data_dict.keys())
print(s_data_dict)
timeline=Timeline(
{"theme":ThemeType.LIGHT}
)# 进行主题颜色的设计
for year in s_data_dict:
data_dict[year].sort(key=lambda element:element[1],reverse=True)
# 去除本年份前八的国家
year_data=data_dict[year][0:8]
x_data=[]
y_data=[]
for i in year_data:
x_data.append(i[0])
y_data.append(i[1]/100000000)
# 构建柱状图对象
x_data=x_data[::-1]# 将轴的数据顺序反转一下,使得GDP高的在上面
y_data=y_data[::-1]# 或者时间使用reverse反转
bar=Bar()
bar.add_xaxis(x_data)
bar.add_yaxis("GDP(亿)",y_data,label_opts=LabelOpts(position="right"))
bar.reversal_axis()# 反转
bar.set_global_opts(
title_opts=TitleOpts(title=f"{year}年全球前8GDP的数据")
)# 进行柱状图标题的设置
# 构建时间线里面的
timeline.add(bar,str(year))
timeline.add_schema(
play_interval=1000,# 自动播放的时间,单位ms
is_timeline_show=True,# 是否在自动播放的时候显示时间线
is_auto_play=True,# 是否自动播放
is_loop_play=True# 是否自动循环播放
)
timeline.render("GDP可动的柱状图.html")
|
总之就是在时间线对象中构建图表的对象