Python基础:20、Python基础综合案例

数据可视化 - 折线图可视化

数据可视化 - 地图

数据可视化 - 动态柱状图

1.json数据格式
  • JSON是一种轻量级的数据交互格式。可以按照JSON指定的格式去组织和封装数据

  • JSON本质上是一个带有特定格式的字符串

主要功能:json就是一种在各个编程语言中流通的数据格式,负责不同编程语言中的数据传递和交互. 类似于:

  • 国际通用语言-英语

  • 中国56个民族不同地区的通用语言-普通话

python 复制代码
"""
    演示JSON数据和Python字典的相互转换
"""
import json
​
# 准备列表,列表内每一个元素都是字典,将其转换为JSON      Python ------------>  JSON :  dumps
data = [{"name": "王大锤", "age": 26}, {"name": "诸葛孔明", "age": 48}, {"name": "狄仁杰", "age": 29}]
json_str = json.dumps(data, ensure_ascii=False)  # ensure_ascii=False 表明不使用ASCII码去转换,直接输出
print(type(json_str))
print(json_str)
​
# 准备字典,将字典转换成JSON     Python ------------>  JSON :  dumps
Data = {"name": "豹豹", "age": 25}
json_str = json.dumps(Data, ensure_ascii=False)  # ensure_ascii=False 表明不使用ASCII码去转换,直接输出
print(type(json_str))
print(json_str)
​
# 将JSON字符串转换为Python数据类型[{k: v, k: v}, {k: v, k: v}]       JSON ------------>  Python :  loads
Str = '[{"name": "豹豹11", "age": 11}, {"name": "豹豹22", "age": 22}]'
l = json.loads(Str)
print(type(l))
print(l)
​
# 将JSON字符串转换为Python数据类型{k: v, k: v}       JSON ------------>  Python :  loads
Str = '{"name": "豹豹33", "age": 33}'
l = json.loads(Str)
print(type(l))
print(l)

总结:

1. json:是一种轻量级的数据交互格式, 采用完全独立于编程语言的文本格式来存储和表示数据(就是字符串)

Python语言使用JSON有很大优势,因为:JSON无非就是一个单独的字典或一个内部元素都是字典的列表

所以JSON可以直接和Python的字典或列表进行无缝转换。

2. json格式数据转化

通过 json.dumps(data) 方法把python数据转化为了 json数据

python 复制代码
data = json.dumps(data)

如果有中文可以带上:ensure_ascii=False参数来确保中文正常转换

通过 json.loads(data) 方法把josn数据转化为了 python列表或字典

python 复制代码
data = json.loads(data)
2.pyecharts模块介绍

官网:pyecharts.org

画廊:Document

画廊的功能:产生各种各样的图表,可供学习

  • 开发可视化图表使用的技术栈是:

Echarts框架的Python版本:PyEcharts包

  • 如何安装PyEcharts包:
python 复制代码
pip install pyecharts
  • 如何查看官方示例

打开官方画廊:

https://gallery.pyecharts.org/#/README

3.pyecharts快速入门
  1. pyecharts模块中有很多的配置选项, 常用到三个类别的选项:
  • 全局配置选项

  • 系列配置选项

  1. 全局配置项能做什么?
  • 配置图表的标题

  • 配置图例

  • 配置鼠标移动效果

  • 配置工具栏

  • 等整体配置项

4.数据处理
python 复制代码
"""
    演示JSON数据和Python字典的相互转换
"""
import json
​
# 准备列表,列表内每一个元素都是字典,将其转换为JSON      Python ------------>  JSON :  dumps
data = [{"name": "王大锤", "age": 26}, {"name": "诸葛孔明", "age": 48}, {"name": "狄仁杰", "age": 29}]
json_str = json.dumps(data, ensure_ascii=False)  # ensure_ascii=False 表明不使用ASCII码去转换,直接输出
print(type(json_str))
print(json_str)
​
# 准备字典,将字典转换成JSON     Python ------------>  JSON :  dumps
Data = {"name": "豹豹", "age": 25}
json_str = json.dumps(Data, ensure_ascii=False)  # ensure_ascii=False 表明不使用ASCII码去转换,直接输出
print(type(json_str))
print(json_str)
​
# 将JSON字符串转换为Python数据类型[{k: v, k: v}, {k: v, k: v}]       JSON ------------>  Python :  loads
Str = '[{"name": "豹豹11", "age": 11}, {"name": "豹豹22", "age": 22}]'
l = json.loads(Str)
print(type(l))
print(l)
​
# 将JSON字符串转换为Python数据类型{k: v, k: v}       JSON ------------>  Python :  loads
Str = '{"name": "豹豹33", "age": 33}'
l = json.loads(Str)
print(type(l))
print(l)
复制代码
5.创建折线图
1.折线图的基本使用
python 复制代码
# 演示pyecharts的基础入门
​
# 导入一个包
from pyecharts.charts import Line
from pyecharts.options import TitleOpts, LegendOpts, ToolboxOpts, VisualMapOpts
​
# 创建一个折线图对象
line = Line()
​
# 给折线图对象添加x轴的数据
line.add_xaxis(["四川", "贵阳", "云南"])
​
# 给折线图对象添加y轴的数据
line.add_yaxis("GDP", [84, 65, 58])
​
# 设置全局配置项 set_global_opts来设置
line.set_global_opts(
    title_opts=TitleOpts(title="GDP展示", pos_left="center", pos_bottom="%1"), # 标题,左右居中,上下占1%的位置
    legend_opts=LegendOpts(is_show=True),  # 图例
    toolbox_opts=ToolboxOpts(is_show=True),  # 工具箱
    visualmap_opts=VisualMapOpts(is_show=True),  # 视觉映射
)
​
# 通过render方法,将代码生成图像
line.render()
复制代码
2.折线图开发
python 复制代码
import json
​
# 导入一个包
from pyecharts.charts import Line
from pyecharts.options import TitleOpts, LegendOpts, ToolboxOpts, VisualMapOpts, LabelOpts
​
# 处理数据
f_us = open("F:/资料/可视化案例数据/折线图数据/美国.txt", "r", encoding="UTF-8")
us_data = f_us.read()
​
f_jp = open("F:/资料/可视化案例数据/折线图数据/日本.txt", "r", encoding="UTF-8")
jp_data = f_jp.read()
​
f_in = open("F:/资料/可视化案例数据/折线图数据/印度.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(", "")
​
# 去掉不合JSON规范的结尾
us_data = us_data[:-2]
jp_data = jp_data[:-2]
in_data = in_data[:-2]
​
# JSON转Python字典
us_dict = json.loads(us_data)
jp_dict = json.loads(jp_data)
in_dict = json.loads(in_data)
​
# 获取trend key
us_trend_data = us_dict['data'][0]['trend']
jp_trend_data = jp_dict['data'][0]['trend']
in_trend_data = in_dict['data'][0]['trend']
​
# 获取日期数据,用于x轴,取2020年(到下标314结束)
us_x_data = us_trend_data['updateDate'][: 314]
jp_x_data = jp_trend_data['updateDate'][: 314]
in_x_data = in_trend_data['updateDate'][: 314]
​
# 获取确认数据,用于x轴,取2020年(到下标314结束)
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)
​
# 给折线图对象添加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))
​
# 设置全局配置项 set_global_opts来设置
line.set_global_opts(
    title_opts=TitleOpts(title="2020年美日印三国确诊人数折线图", pos_left="center", pos_bottom="1%"), # 标题,左右居中,上下占1%的位置
    # legend_opts=LegendOpts(is_show=True),  # 图例
    # toolbox_opts=ToolboxOpts(is_show=True),  # 工具箱
    # visualmap_opts=VisualMapOpts(is_show=True),  # 视觉映射
)
​
# 通过render方法,将代码生成图像
line.render()
​
# 关闭文件
f_us.close()
f_jp.close()
f_in.close()
复制代码
6.创建地图
1.地图可视化的基本使用
python 复制代码
from pyecharts.charts import Map
from pyecharts.options import VisualMapOpts
​
# 准备地图对象
map = Map()
​
# 准备数据
data = [
    ("北京市", 99),
    ("上海市", 199),
    ("湖南省", 256),
    ("台湾省", 345),
    ("广东省", 499)
]
​
# 添加数据
map.add("测试地图", data, "china")
​
# 设置全局选项
map.set_global_opts(
    visualmap_opts=VisualMapOpts(
        is_show=True,
        is_piecewise=True,
        pieces=[
            {"min": 1, "max": 9, "lable": "1-9", "color": "#CCFFFF"},
            {"min": 10, "max": 99, "lable": "10-99", "color": "#FFFF99"},
            {"min": 100, "max": 199, "lable": "100-199", "color": "#FF9966"},
            {"min": 200, "max": 299, "lable": "200-299", "color": "#FF6666"},
            {"min": 300, "max": 399, "lable": "300-399", "color": "#CC3333"},
            {"min": 400, "max": 499, "lable": "400-499", "color": "#990033"}
        ]
    )
)
​
# 绘图
map.render()
复制代码
2.全国疫情可视化地图开发
python 复制代码
import json
from pyecharts.charts import Map
from pyecharts.options import TitleOpts, VisualMapOpts
​
# 读取数据文件
f = open("F:/资料/可视化案例数据/地图数据/疫情.txt", "r", encoding="UTF-8")
data = f.read()
​
# 关闭文件
f.close()
​
# JSON数据转换为python字典
dict_data = json.loads(data)
​
# 读取到各个省份的数据
province_data_list = dict_data["areaTree"][0]["children"]
​
# 组装每个省份和确诊人数为元组,并将各个省份的数据都封装到列表内
data_list = []   # 绘图需要用的数据列表
​
for province_data in province_data_list:
    name = province_data["name"]                           # 省份名称
    province_confirm = province_data["total"]["confirm"]   # 确诊人数
    data_list.append((name+'省', province_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": 9, "lable": "1-9", "color": "#CCFFFF"},
                {"min": 10, "max": 99, "lable": "10-99", "color": "#FFFF99"},
                {"min": 100, "max": 999, "lable": "100-999", "color": "#FF9966"},
                {"min": 1000, "max": 9999, "lable": "1000-9999", "color": "#FF6666"},
                {"min": 10000, "max": 99999, "lable": "10000-99999", "color": "#CC3333"},
                {"min": 100000, "max": 999999, "lable": "100000-999999", "color": "#990033"}
            ]
        )
)
​
# 绘图
map.render("全国疫情地图.html")
​
3.省级疫情可视化地图开发
python 复制代码
"""
    演示河南省疫情地图开发
"""
import json
from pyecharts.charts import Map
from pyecharts.options import TitleOpts, VisualMapOpts
​
# 读取文件
f = open("F:/资料/可视化案例数据/地图数据/疫情.txt", "r", encoding="UTF-8")
data = f.read()
​
# 关闭文件
f.close()
​
# 获取数据
data_dict = json.loads(data)
province_data_list = data_dict["areaTree"][0]["children"][3]["children"]
​
# 准备数据
data_list = []
for city_data in province_data_list:
    name = city_data["name"] + "市"
    Data_List = city_data["total"]["confirm"]
    data_list.append((name, Data_List))
​
# 手动添加城市的数据
data_list.append(("济源市", 5))
​
# 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": 10, "lable": "1-9", "color": "#CCFFFF"},
                {"min": 11, "max": 20, "lable": "10-20", "color": "#FFFF99"},
                {"min": 21, "max": 50, "lable": "21-50", "color": "#FF9966"},
                {"min": 51, "max": 100, "lable": "51-100", "color": "#FF6666"},
                {"min": 100, "max": 200, "lable": "100-200", "color": "#CC3333"},
                {"min": 200, "max": 500, "lable": "200-500", "color": "#990033"}
            ]
        )
)
​
# 绘图
map.render("河南省疫情地图.html")
复制代码
7.创建动态柱状图
1.基础柱状图的使用
python 复制代码
# 演示柱状图的基本使用
from pyecharts.charts import Bar
from pyecharts.options import LabelOpts
​
# 使用Bar构建基础柱状图
bar = Bar()
​
# 添加X轴的数据
bar.add_xaxis(["中国", "美国", "英国"])
​
# 添加Y轴的数据
bar.add_yaxis("GDP", [30, 20, 10], label_opts=LabelOpts(position="right"))  #标签在右侧
​
# 反转X轴和Y轴
bar.reversal_axis()
​
# 设置数值标签在右侧
# 在Y轴里添加:label_opts=LabelOpts(position="right")
# 绘图
bar.render("基础柱状图演示.html")
​
2.基础时间线柱状图的使用
python 复制代码
# 创建时间线对象
timeline = Timeline(
    {"theme": ThemeType.LIGHT}   # 主图设置颜色
)
复制代码
python 复制代码
# 设置自动播放
timeline.add_schema(
    play_interval=1000,      # 自动播放时间间隔,ms
    is_timeline_show=True,   # 是否自动播放的时候,显示时间线
    is_auto_play=True,       # 是否自动播放
    is_loop_play=True        # 是否循环自动播放
)
python 复制代码
# 演示基础时间线柱状图的使用
from pyecharts.charts import Bar, Timeline
from pyecharts.options import LabelOpts
from pyecharts.globals import ThemeType
​
# 使用Bar构建基础柱状图
bar = Bar()
bar2 = Bar()
bar3 = Bar()
​
# 添加X轴的数据
bar.add_xaxis(["中国", "美国", "英国"])
# 添加Y轴的数据
bar.add_yaxis("GDP", [30, 20, 10], label_opts=LabelOpts(position="right"))  #标签在右侧
# 反转X轴和Y轴
bar.reversal_axis()
​
# 添加X轴的数据
bar2.add_xaxis(["中国", "美国", "英国"])
# 添加Y轴的数据
bar2.add_yaxis("GDP", [50, 10, 30], label_opts=LabelOpts(position="right"))  #标签在右侧
# 反转X轴和Y轴
bar2.reversal_axis()
​
# 添加X轴的数据
bar3.add_xaxis(["中国", "美国", "英国"])
# 添加Y轴的数据
bar3.add_yaxis("GDP", [80, 30, 50], label_opts=LabelOpts(position="right"))  #标签在右侧
# 反转X轴和Y轴
bar3.reversal_axis()
​
​
# 创建时间线对象
timeline = Timeline(
    {"theme": ThemeType.LIGHT}   # 主图设置颜色
)
​
# timeline 对象添加bar柱状图
timeline.add(bar, "2021年GDP")
timeline.add(bar2, "2022年GDP")
timeline.add(bar3, "2023年GDP")
​
# 设置自动播放
timeline.add_schema(
    play_interval=1000,      # 自动播放时间间隔,ms
    is_timeline_show=True,   # 是否自动播放的时候,显示时间线
    is_auto_play=True,       # 是否自动播放
    is_loop_play=True        # 是否循环自动播放
)
​
# 绘图
timeline.render("基础时间线柱状图演示.html")
复制代码
3.动态时间线主状态的使用
python 复制代码
"""
    拓展列表的sort使用
    学习将函数作为参数传递之后,可以学习列表的sort方法来对列表进行自定义排序
"""
# 准备列表
my_list = [["a", 33], ["b", 55], ["c", 11]]
​
# 排序,基于带名函数   reverse:是否反转
# def choose_sort_key(element):
#     return element[1]
#
# my_list.sort(key=choose_sort_key, reverse=True)
​
# print(my_list)
​
# 排序,基于;lambda匿名函数
my_list.sort(key=lambda element:element[1], reverse=True)
print(my_list)
python 复制代码
[['b', 55], ['a', 33], ['c', 11]]
python 复制代码
"""
    演示:GDP动态时间线柱状图的开发
"""
from pyecharts.charts import Bar, Timeline
from pyecharts.options import *
from pyecharts.globals import ThemeType

# 读取数据
f = open("F:/学习/1.笔记/Python/资料/资料/可视化案例数据/动态柱状图数据/1960-2019全球GDP数据.csv", "r", encoding="GB2312")
data_lines = f.readlines()  # 读取每一行数据
# print(data_lines)

# 关闭文件
f.close()

# 删除第一条(行)数据
data_lines.pop(0)

# 将数据转换成字典存储,格式wei:
# {年份: [[国家,gdp], [[国家,gdp],...], 年份: [[国家,gdp], [[国家,gdp],...]}
data_dict = {}
for line in data_lines:
    year = int(line.split(",")[0])    # 年份  这里要转换一下
    country = line.split(",")[1]      # 国家
    gdp = float(line.split(",")[2])   # gdp数据   float可以将科学计数法的数字转换出来

    # 如何判断字典里有没有指定的key呢
    try:
        data_dict[year].append([country, gdp])
    except KeyError:
        data_dict[year] = []
        data_dict[year].append([country, gdp])

# print(data_dict)
# 创建时间线对象
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)
    # 取出本年份前8名的国家
    year_data = data_dict[year][0: 8]
    x_data = []
    y_data = []
    # print(year_data)

    # for循环每一年的数据,基于每一年的数据,创建每一年的bar对象
    # 在for循环里将每一年的bar对象添加到时间线里
    for country_gdp in year_data:
        x_data.append(country_gdp[0])      # x轴添加国家
        y_data.append(country_gdp[1] / 1000000000)      # y轴添加GDP数据
        # print(x_data)
        # print(y_data)

    # 构建柱状图
    x_data.reverse()
    y_data.reverse()

    bar = Bar()
    bar.add_xaxis(x_data)
    bar.add_yaxis("GDP(亿)", y_data, label_opts=LabelOpts(position="right"))

    # 反转x轴和y轴
    bar.reversal_axis()

    # 设置每一年的标题
    bar.set_global_opts(
        title_opts=TitleOpts(title=f"{year}年全球前8国家GDP数据")
    )

    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("1960-2019年GDP前8国家.html")
相关推荐
jonyleek9 分钟前
数据可视化:JVS-BI仪表盘图表样式配置全攻略,打造个性化数据展示!
java·大数据·信息可视化·数据挖掘·数据分析·自动化·软件需求
图扑软件14 分钟前
掌控物体运动艺术:图扑 Easing 函数实践应用
大数据·前端·javascript·人工智能·信息可视化·智慧城市·可视化
demodeom17 分钟前
Python 操作 读/写 Excel
服务器·python·excel
进步哥40 分钟前
python之爬虫遇到返回内容乱码
开发语言·爬虫·python
云天徽上1 小时前
【NLP-06】词形还原(Lemmatization)深度解析与实践
python·机器学习·自然语言处理
Nerinic1 小时前
Python基础10
python
白狐欧莱雅1 小时前
使用Python中的DrissonPage库爬取小说网站并保存章节内容(bqg)
经验分享·笔记·python·自动化·drissonpage
武子康1 小时前
大数据-197 数据挖掘 机器学习理论 - scikit-learn 泛化能力 交叉验证
大数据·人工智能·python·机器学习·数据挖掘·scikit-learn
FOYA传媒科技2 小时前
FOYA传媒科技招聘
java·css·vue.js·python·科技·html5·传媒
.信.2 小时前
书生实战营第四期-第三关 Git+InternStudio
linux·人工智能·git·python