python基础5_案例总结+数据可视化
文章目录
1. json数据格式
-
什么是JSON:
- JSON是一种轻量级的数据交互格式,可以按照JSON指定的格式去组织和封装数据
- JSON本质上是一个带有特定格式的字符串
-
主要功能:
- JSON就是一种在各个编程语言中流通的数据格式,负责不同编程语言中的数据传递和交互
- 各种编程语言存储数据的容器不尽相同,在python中有字典这样的数据类型,而其他语言可能没有对应的字典
- 为了让不同的语言都能够相互通用的互相传递数据,JSON就是一种非常良好的中转数据格式
-
JSON数据格式转化:
-
JSON格式的数据要求:
# JSON的数据结构可以是: {"name": "admin", "age": 18} # 也可以是: [{"name": "admin", "age": 18}, {"name": "admin", "age": 18}, {"name": "admin", "age": 18}]
-
python数据和JSON数据的相互转化:
# 导入JSON模块 import json # 准备符合格式JSON格式要求的python数据 data = [{"name": "laowang", "age": 16}, {"name": "zhangsan", "age": 20}] # 通过json.dumps(data)方法把python数据转化为了json数据 data = json.dumps(data) # 如果有中文可以带上ensure_ascii=False参数来确保中文正常转换 # 通过json.loads(data)方法把json数据转化为了python数据 data = json.loads(data)
-
2. pyecharts模块介绍
如果想要做出数据可视化效果图,可以借助pyecharts模块来完成
- 概况:echarts是个由百度开源的数据可视化,凭借着良好的交互性,精巧的图表设计,得到了众多开发者的认可。而python是门富有表达力的语言,很适合用于数据处理。当数据分析遇上数据可视化时pyecharts诞生了
- pyecharts模块安装:pip install pyecharts
- 查看官方示例:打开官方画廊(https://gallery.pyecharts.org/#/README)
3. pyecharts快速入门
-
基础折线图:
# 导包,导入Line功能构建折线图对象 from pyecharts.charts import Line # 得到折线图对象 line = Line() # 添加x轴数据 line.add_xaxis(["中国", "美国", "英国"]) # 添加y轴数据 line.add_xaxis("GDP", [30, 20, 10]) # 生成图表 line.render()
-
pyecharts模块中有很多的配置选项:
- 全局配置选项:可以通过set_global_opts方法来进行配置(详见官网全局配置项 - pyecharts - A Python Echarts Plotting Library built with love.)
- 配置图表的标题
- 配置图例
- 配置鼠标移动效果
- 配置工具栏
- 等等整体配置项
- 系列配置选项:后面的案例会讲到
- 全局配置选项:可以通过set_global_opts方法来进行配置(详见官网全局配置项 - pyecharts - A Python Echarts Plotting Library built with love.)
4. 数据处理
-
数据如下:
-
处理示例:
import json # 处理数据 f_us = open("D:/BaiduNetdiskDownload/资料/资料/可视化案例数据/折线图数据/美国.txt", "r", encoding="UTF-8") us_data = f_us.read() # 美国数据的全部内容 us_data = us_data.replace("jsonp_1629344292311_69436(", "") us_data = us_data.replace(");", "") # 去掉不符合规范的开头结尾 us_dict = json.loads(us_data) # 转化为python字典 us_trend_data = us_dict["data"][0]["trend"] # 获取有效数据 us_x_data = us_trend_data["updateDate"][:314:1] # 获取x轴日期数据 us_y_data = us_trend_data["list"][0]["data"][:314:1] # 获取y轴确诊数据
5. 创建折线图
-
代码(接上数据处理):
# 构建图表 us_line = Line() us_line.add_xaxis(us_x_data) us_line.add_yaxis("确诊", us_y_data) us_line.render()
-
图表:
6. 疫情地图案例
-
疫情地图(国内疫情地图)代码:
import json from pyecharts.charts import Map from pyecharts.options import VisualMapOpts, TitleOpts # 处理数据 f = open("D:/BaiduNetdiskDownload/资料/资料/可视化案例数据/地图数据/疫情.txt", "r", encoding="UTF-8") yq_data = f.read() # 数据的全部内容 yq_dict = json.loads(yq_data) # 转化为python字典 province_data_list = yq_dict["areaTree"][0]["children"] # 获取有效数据 data_list = [] # 绘制图表要用到的数据 for province_data in province_data_list: # 存数据 province_name = province_data["name"] province_confirm = province_data["total"]["confirm"] data_list.append((province_name, province_confirm)) # 绘制图表 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": 9, "label": "1-9人", "color": "#CCFFFF"}, {"min": 10, "max": 99, "label": "10-99人", "color": "#FFFF99"}, {"min": 100, "max": 499, "label": "99-499人", "color": "#FF9966"}, {"min": 500, "max": 999, "label": "499-999人", "color": "#FF6666"}, {"min": 1000, "max": 9999, "label": "1000-9999人", "color": "#CC3333"}, {"min": 10000, "label": "10000人以上", "color": "#990033"}, ] ) ) map.render() # 关闭文件 f.close()
-
疫情地图(国内疫情地图)效果:
-
疫情地图(省级疫情地图)代码:
import json from pyecharts.charts import Map from pyecharts.options import * # 处理数据 f = open("D:/BaiduNetdiskDownload/资料/资料/可视化案例数据/地图数据/疫情.txt", "r", encoding="UTF-8") yq_data = f.read() # 数据的全部内容 yq_dict = json.loads(yq_data) # 转化为python字典 province_data_list = yq_dict["areaTree"][0]["children"][24]["children"] # 获取有效数据 data_list = [] # 绘制图表要用到的数据 for province_data in province_data_list: # 存数据 province_name = province_data["name"]+"市" province_confirm = province_data["total"]["confirm"] data_list.append((province_name, province_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": 9, "label": "1-9人", "color": "#CCFFFF"}, {"min": 10, "max": 19, "label": "10-19人", "color": "#FFFF99"}, {"min": 20, "max": 29, "label": "20-29人", "color": "#FF9966"}, {"min": 30, "max": 39, "label": "30-39人", "color": "#FF6666"}, {"min": 40, "max": 49, "label": "40-49人", "color": "#CC3333"}, {"min": 50, "label": "50人以上", "color": "#990033"}, ] ) ) map.render("吉林省疫情地图.html") # 关闭文件 f.close()
-
疫情地图(省级疫情地图)效果:
7. 动态柱状图示例
-
基础柱状图
# 导入 from pyecharts.charts import Bar # 构建柱状图对象 bar = Bar() # 添加x轴数据 bar.add_xaxis(["chinese", "american", "us"]) # 添加y轴数据 bar.add_yaxis("GDP", [30, 20, 10]) # 绘图 bar.render()
-
反转x轴和y轴+设置数值标签位置
# 导入 from pyecharts.charts import Bar from pyecharts.options import LabelOpts # 构建柱状图对象 bar = Bar() # 添加x轴数据 bar.add_xaxis(["chinese", "american", "us"]) # 添加y轴数据 bar.add_yaxis("GDP", [30, 20, 10], label_opts=LabelOpts(position="right")) # 反转x轴和y轴 bar.reversal_axis() # 绘图 bar.render()
-
总结:
- 通过Bar()构建一个柱状图对象
- 和折线图一样,通过add_xaxis()和add_yaxis()添加x轴和y轴数据
- 通过柱状图的对象的reversal_axis(),反转x轴和y轴
- 通过label_opts = LabelOpts(position=“right”)设置数值标签在右侧显示
-
基础时间线柱状图:
-
Timeline()时间线:柱状图描述的是分类数据,回答的是每一个分类中”有多少?“这个问题,这是柱状图的主要特点;同时柱状图很难动态的描述一个趋势性的数据;这里pyecharts为我们提供了一种解决方案——时间线
-
如果说一个Bar、Line对象是一张图表的话,时间线就是创建一个一维的x轴,轴上每一个点就是一个图标对象
-
示例:
# 导入 from pyecharts.charts import Bar, Timeline from pyecharts.options import LabelOpts from pyecharts.globals import ThemeType # 构建柱状图对象 bar1 = Bar() bar1.add_xaxis(["chinese", "american", "us"]) bar1.add_yaxis("GDP", [30, 20, 10], label_opts=LabelOpts(position="right")) bar1.reversal_axis() bar2 = Bar() bar2.add_xaxis(["chinese", "american", "us"]) bar2.add_yaxis("GDP", [50, 40, 400], label_opts=LabelOpts(position="right")) bar2.reversal_axis() bar3 = Bar() bar3.add_xaxis(["chinese", "american", "us"]) bar3.add_yaxis("GDP", [60, 60, 600], label_opts=LabelOpts(position="right")) bar3.reversal_axis() # 构建时间线对象 + 主题设置 timeline = Timeline( {"theme": ThemeType.LIGHT} ) # 在时间线内添加柱状图对象 timeline.add(bar1, "点1") timeline.add(bar2, "点2") timeline.add(bar3, "点3") # 自动播放设置 timeline.add_schema( play_interval=1000, # 自动播放的时间间隔, 单位毫秒 is_timeline_show=True, # 是否在自动播放的时候显示时间线 is_auto_play=True, # 是否自动播放 is_loop_play=True # 是否循环自动播放 ) # 绘图 timeline.render()
-
-
GDP动态柱状图绘制示例:
-
列表的sort方法:对数据容器进行排序(使用方法如下)
- 列表.sort(key=选择排序依据的函数, reverse=True|False)
- 参数key,是要求传入一个函数,表示将列表的每一个元素都传入函数中,返回排序的依据
- 参数reverse,是否反转排序结果,True表示降序,False表示升序
-
示例:
# 导入 from pyecharts.charts import Bar, Timeline from pyecharts.options import * from pyecharts.globals import ThemeType # 引入文件 f = open("D:/BaiduNetdiskDownload/资料/资料/可视化案例数据/动态柱状图数据/1960-2019全球GDP数据.csv", "r", encoding="GB2312") # 数据处理 data_lines = f.readlines() data_lines.pop(0) # 删除第一条数据 data_dict = {} for line in data_lines: year = int(line.split(",")[0]) country = line.split(",")[1] gdp = float(line.split(",")[2]) try: data_dict[year].append([country, gdp]) except KeyError: data_dict[year] = [] data_dict[year].append([country, gdp]) # 将数据存为字典类型 # 创建时间线对象 timeline = Timeline( {"theme": ThemeType.LIGHT} ) # 排序年份 sorted_year_list = sorted(data_dict.keys()) for year in sorted_year_list: data_dict[year].sort(key=lambda element: element[1], reverse=True) year_data = data_dict[year][0:8] x_data = [] y_data = [] for country_gdp in year_data: x_data.append(country_gdp[0]) y_data.append(country_gdp[1]) bar = Bar() # 创建柱状图 x_data.reverse() y_data.reverse() bar.add_xaxis(x_data) bar.add_yaxis("GDP(亿)", y_data, label_opts=LabelOpts(position="right")) bar.reversal_axis() timeline.add(bar, str(year)) # 设置时间线自动播放 timeline.add_schema( play_interval=1000, # 自动播放的时间间隔, 单位毫秒 is_timeline_show=True, # 是否在自动播放的时候显示时间线 is_auto_play=True, # 是否自动播放 is_loop_play=True # 是否循环自动播放 ) # 绘图 timeline.render() # 关闭文件 f.close()
-