Day7--python

1,JSON数据格式

什么是json:json是一种轻量级的数据交互格式,可以按照JSON指定的格式去组织和封装数据,JSON本质上是一个带有特定格式的字符串

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

国际通用语言--英语

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

json用处:各种编程语言存储数据的容器不尽相同,在Python中有字典dict这样的数据类型,而其他语言可能没有对应的字典 为了让不同的语言都能够相互通用得到互相传递数据,JSON就是一种非常良好的中转数据格式

json格式数据转化

2.pyecharts

Echarts是个由百度开源的数据可视化,凭借着良好的交互性,精巧的图标设计,得到了众多开发者的认可,而python是门富有表达力的语言,很适合用于数据处理,当数据分析遇上数据可视化时,pyecharts诞生了 官网:pyecharts.org

安装pyecharts:pip install pyecharts

打开官方画廊:https://gallery.pyecharts.org/#/README

3.pyecharts快速入门

1.构建一个基础的折线图

代码案例:美日印三国GDP对比

python 复制代码
# 导包
import json
from pyecharts.charts import Line
from pyecharts.options import TitleOpts, LegendOpts, ToolboxOpts, VisualMapOpts

# 处理数据/打开文件
# 美国
f_us = open("D.美国.text","r",encoding="utf-8")
us_data = f_us.read()
# 日本
f_jp = open("D.日本.text","r",encoding="utf-8")
jp_data = f_jp.read()
# 印度
f_in = open("D.印度.text","r",encoding="utf-8")
in_data = f_in.read()

# 去掉不合json的开头
us_data = us_data.replace("美国前面的数字","")
jp_data = jp_data.replace("日本前面的数字","")
in_data = in_data.replace("印度前面的数字","")
# 去掉不合json的结尾
us_data = us_data[:-2]
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)

# 获取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结束)
x_us_data = us_trend_data["updateDate"][:314]
x_jp_data = jp_trend_data["updateDate"][:314]
x_in_data = in_trend_data["updateDate"][:314]
# 获取确认数据,用于y轴,取2020年(到下标)
y_us_data = us_trend_data["list"][0]["data"][:314]
y_jp_data = jp_trend_data["list"][0]["data"][:314]
y_in_data = in_trend_data["list"][0]["data"][:314]

# 设置全局选项
line.set_global_opts(
    # 标题设置
    title_opts = TitleOpts(title="美日印疫情感染人数(至2020年)",pos_left="center",pos_top="10%"),
    legend_opts = LegendOpts(is_show=True),     # 图例
    toolbox_opts = ToolboxOpts(is_show=True),   # 工具箱
    visualmap_opts = VisualMapOpts(is_show=True)   #视觉映射
)

# 生成图表
line = Line()

# 添加x轴数据
line.add_xaxis(x_us_data)   # x轴是公用的
# 添加y轴数据(设置图例属性,False表示常态不显示,鼠标悬浮显示)
line.add_yaxis("美国确诊人数",y_us_data,label_opts=LabelOpts(is_show=False))  # 添加美国y轴数据
line.add_yaxis("日本确诊人数",y_jp_data,label_opts=LabelOpts(is_show=False))  # 添加日本y轴数据
line.add_yaxis("印度确诊人数",y_in_data,label_opts=LabelOpts(is_show=False))  # 添加印度y轴数据

#关闭文件
f_us.close()
f_jp.close()
f_in.close()

pyecharts的配置选项

pyecharts模块中有很多的配置选项,常用2个类别的选项:

全局配置选项:全局配置可以通过set_global_opts来配置

系列配置选项

2.基础地图构建

基础地图演示:视觉映射器

例示:

python 复制代码
# 导包
from pyecharts.charts import Map
from pyecharts.options import VisualMapOpts

# 准备地图对象
map = Map()
# 准备数据
data = [
    ("北京市" ,99),
    ("上海市",199),
    ("湖南省",299),
    ("江西省",199),
    ("广东省",399)
]
# 添加数据
map.add("测试用",data,"china")
# 配置全局属性
map.set_global_opts(
    visualmap_opts=VisualMapOpts(
        is_show=True,
        is_piecewise=True,
        pieces=[
            {"min": 1,"max" : 99,"label": "1-99","color":"#AAAAAA"},
            {"min": 100,"max": 199,"label": "100-199","color":"#BBBBBB"},
            {"min": 200,"max":299,"label": "200-299","color":"#CCCCCC"},
            {"min": 300,"max":399,"label": "300-399","color":"#DDDDDD"}
        ]
    )
)
# 绘图
map.render()

全国地图案例:

python 复制代码
# 导包
import json
from pyecharts.charts import Map
from pyecharts.options import *
# 读取数据文件
f = open("D:/疫情.txt","r",encoding="utf-8")
data = f.read()
# 关闭文件
f.close()

# 将字符串json转换为python字典
data_dict = json.loads(data)
# 从字典中取出省份的数据
province_data_list = data_dict["areaTree"][0]["children"]
# 通过for循环取到所有省份的数据
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": 99,"lobel":"1-99人","color": "#CCFFFF"},
                {"min": 100,"max": 999,"lobel":"100-999人","color": "#FFFF99"},
                {"min": 1000,"max": 4999,"lobel":"1000-4999人","color": "#FF9966"},
                {"min": 5000,"max": 9999,"lobel":"5000-9999人","color": "#FF6666"},
                {"min": 10000,"max": 99999,"lobel":"10000-99999人","color": "#CC3333"},
                {"min": 100000,"lobel":">100000人","color": "#990033"},
            ]
        )
)

# 绘图
map.render("map.html")

地方省市地图案例(河南省):

python 复制代码
# 导包
import json
from pyecharts.charts import Map
from pyecharts.options import *

# 读取文件
f = open("D:/疫情.txt","r",encoding="utf-8")
data = f.load(f)
# 关闭文件
f.close()

# 获取省市数据
# json字符串转python字典
data_dict = json.loads(data)
# 取数据
cities_data = data_dict["areaTree"][0]["children"][3]["children"]

# for循环得到各个城市的数据
data_dict = []
for city_data in cities_data:
    city_name = city_data["name"] + "市"
    city_comfirm = city_data["total"]["comfirm"]
    data_dict.append((city_name, city_comfirm))

# 构建地图
map = Map()
# 添加数据
map.add("河南省疫情分布",data_dict,"河南")

# 设置全局选项
map.set_global_opts(
        title_opts = TitleOpts(title="河南省疫情地图"),  # 标题
        visualmap_opts=VisualMapOpts(
            is_show=True,       # 是否显示
            is_piecewise=True,  # 是否分段
            pieces=[
                {"min": 1,"max": 99,"lobel":"1-99人","color": "#CCFFFF"},
                {"min": 100,"max": 999,"lobel":"100-999人","color": "#FFFF99"},
                {"min": 1000,"max": 4999,"lobel":"1000-4999人","color": "#FF9966"},
                {"min": 5000,"max": 9999,"lobel":"5000-9999人","color": "#FF6666"},
                {"min": 10000,"max": 99999,"lobel":"10000-99999人","color": "#CC3333"},
                {"min": 100000,"lobel":">100000人","color": "#990033"},
            ]
        )
)

# 绘图
map.render("河南省疫情地图.html")

3.动态柱状图开发

例示代码:

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()

# 绘图
bar.render("基础柱状图.html")

创建时间线

设置自动播放

时间线设置主题

实例:

python 复制代码
# 导包
from pyecharts.charts import Bar,Timeline
from pyecharts.options import LabelOpts

# 使用Bar构建基础柱状图
# 第一年
bar1 = Bar()
bar1.add_xaxis(["中国","美国","英国"])
bar1.add_yaxis("GDP", [30, 20, 10], label_opts=LabelOpts(
    position="right"
))
bar1.reversal_axis()
# 第二年
bar2 = Bar()
bar2.add_xaxis(["中国","美国","英国"])
bar2.add_yaxis("GDP", [50, 30, 20], label_opts=LabelOpts(
    position="right"
))
bar2.reversal_axis()
# 第三年
bar3 = Bar()
bar3.add_xaxis(["中国","美国","英国"])
bar3.add_yaxis("GDP", [60, 40, 30], label_opts=LabelOpts(
    position="right"
))
bar3.reversal_axis()

# 构建时间线对象
timeline = Timeline(
    {"theme": ThemeType.LIGHT}  # 主题为颜色蓝黄粉,备注高亮颜色
)
# 在时间线内添加柱状图对象
timeline.add(bar1,"第一年")
timeline.add(bar2,"第二年")
timeline.add(bar3,"第三年")
# 绘图用时间线对象绘图
timeline.render("基础时间线柱状图.html")
# 自动播放设置
timeline.add_schema(
    play_interval=1000,     # 自动播放的时间间隔(单位毫秒)
    is_timeline_show=True,  # 是否在自动播放时,显示时间线
    is_auto_play=True,      # 是否自动播放
    is_loop_play=True       # 是否循环自动播放
)

# 绘图
# bar.render("基础柱状图.html")

在正式写GDP数据之前,我们还要先学习列表的sort方法

案例需求:

代码

python 复制代码
# 导包
import json
from pyecharts.charts import Bar,Timeline
from pyecharts.options import *

# 打开文件
f = open("D:/1960-2019全国GDP数据.csv","r",encoding="GB2312")
data_lines = f.readlines()
# 关闭文件
f.close()

# 删除第一条数据
data_lines.pop(0)
# 将数据转换为字典存储,格式为:
# {年份:[[国家,GDP],[国家,GDP],[国家,GDP],...], 年份:[[国家,GDP],[国家,GDP],[国家,GDP],...],......}
# 定义一个空字典存储
data_dict = {}
# for循环拿到每一行数据
for line in data_lines:
    year = int(line.split(",")[0])  # 年份
    country = line.split(",")[1]    # 国家
    gdp = float(line.split(",")[2]) # gdp数据
    # 如何判断字典里面有没有指定的key?
    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循环依次取出
for year in sorted_year_list:
    data_dict[year].sort(key = lambda x:x[1],reverse = True)    # 将数据按GDP大小排序
    # 取出本年份前八名的国家
    year_data = data_dict[year][0,8]
    x_data = []
    y_data = []
    for country_gdp in year_data:
        x_data.append(country_gdp[0])   # x轴添加国家
        y_data.append(country_gdp[1] / 100000000)   # y轴添加gdp数据

    # 构建柱状图
    bar = Bar()
    # 反转设置最高GDP在最上面
    x_data.reverse()
    y_data.reverse()
    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}年全球GDP前8国家")
    )

    # 在时间线内添加柱状图对象
    timeline.add(bar, str(year))

# 时间线设置自动播放
timeline.add_schema(
    play_interval=1000,     # 自动播放的时间间隔(单位毫秒)
    is_timeline_show=True,  # 是否在自动播放时,显示时间线
    is_auto_play=True,      # 是否自动播放
    is_loop_play=False       # 是否循环自动播放
)

# 绘图
timeline.render("1960-2019全球GDP前8国家.html")
相关推荐
曲幽6 小时前
FastAPI不止于API:手把手教你用Jinja2打造动态Web页面
python·fastapi·backend·jinja2·full stack·template engine·web development
禹凕6 小时前
Python编程——进阶知识(多线程)
开发语言·爬虫·python
Ulyanov6 小时前
基于Pymunk物理引擎的2D坦克对战游戏开发
python·游戏·pygame·pymunk
铉铉这波能秀6 小时前
LeetCode Hot100数据结构背景知识之字典(Dictionary)Python2026新版
数据结构·python·算法·leetcode·字典·dictionary
蜡笔小马6 小时前
10.Boost.Geometry R-tree 空间索引详解
开发语言·c++·算法·r-tree
IOsetting6 小时前
金山云主机添加开机路由
运维·服务器·开发语言·网络·php
程序媛徐师姐6 小时前
Python基于爬虫的网络小说数据分析系统【附源码、文档说明】
爬虫·python·python爬虫·网络小说数据分析系统·pytho网络小说数据分析系统·python爬虫网络小说·python爬虫的网络小说数据
清水白石0086 小时前
深入解析 LRU 缓存:从 `@lru_cache` 到手动实现的完整指南
java·python·spring·缓存
林开落L6 小时前
从零开始学习Protobuf(C++实战版)
开发语言·c++·学习·protobuffer·结构化数据序列化机制