前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >python基础——json数据及pyecharts入门使用【用pyecharts生成折线图,地图,和动态柱状图】

python基础——json数据及pyecharts入门使用【用pyecharts生成折线图,地图,和动态柱状图】

作者头像
用户11029137
发布2024-04-15 09:06:51
1270
发布2024-04-15 09:06:51
举报
文章被收录于专栏:编程学习编程学习

📝前言: 这篇文章主要记录一下使用pyecharts生成GDP折线图的步骤和过程

一,json数据

1,json数据的特点

什么是json数据? JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于阅读和编写,同时也易于机器解析和生成。它是基于 JavaScript 的对象表示法,但也可以在其他编程语言中使用。

很抽象,对于我们初学python来说只需要了解: 它就像一个中转站,其他语言如C语言,python可以转换成json数据,而json数据又可以被转换成其他语言 (从而实现把C语言的数据转换成python的数据)

json本质上就是有特定格式的字符串,它的类型是字符串 json的数据格式要求很严格,一般是下面两种:

(这看起来就像是:1,字典;2,以字典为元素的列表)

2,json数据与python数据间的转换

使用 dumps(转json)和loads(转python) 当json数据规范的时候(像上面两种形式),我们就可以将其转换成python数据 当python数据符合json的格式的时候,我们也可以将其转换成json数据

方法如下:

(注意:python数据转换成json的时候,中文会被转换成Unicode的字符) 如果想要显示中文,则需要把dumps中的第二个参数ensure_ascii设置成False

代码语言:javascript
复制
import json
# 将python数据转换成json
dict = {"张三":33, "李四":42}
j1 = json.dumps(dict)
print(j1) # 第一行输出的

j2 = json.dumps(dict, ensure_ascii=False)
print(j2) # 第二行输出的

输出结果:

下面有个好用的网址: 懒人工具(用于json格式化):http://www.kuquidc.com/ 或者(搜索:ab173)

二,pyecharts

pyecharts是一个用来做数据可视化的模块,在这里不过多介绍。 可以看下它的官网:pyecharts.org 以及pyecharts-gallery:gallery.pyecharts.org

三,生成折线图

代码语言:javascript
复制
# 导包
import json # json
from pyecharts.charts import Line # 折线图对象
from pyecharts.options import LabelOpts, TitleOpts # 配置项

# 读取文件,拿数据(json数据的本质是特殊字符串)
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(","")
us_data = us_data[:-2]
jp_data = jp_data.replace("jsonp_1629350871167_29498(","")
jp_data = jp_data[:-2]
in_data = in_data.replace("jsonp_1629350745930_63180(","")
in_data = in_data[:-2]

# 把json数据转换成字典
us_data = json.loads(us_data)
jp_data = json.loads(jp_data)
in_data = json.loads(in_data)

# 拿到获取 确诊人数和日期数据 trend 的key
us_key = us_data["data"][0]["trend"]
jp_key = jp_data["data"][0]["trend"]
in_key = in_data["data"][0]["trend"]

# 获取x轴数据
us_x = us_key["updateDate"][:314]
jp_x = jp_key["updateDate"][:314]
in_x = in_key["updateDate"][:314]

# 获取y轴数据
us_y = us_key["list"][0]["data"][:314]
jp_y = jp_key["list"][0]["data"][:314]
in_y = in_key["list"][0]["data"][:314]

# 数据获取完成,接下来就可以生成折线图
# 生成折线图对象
line = Line()

# 设置x轴
line.add_xaxis(us_x) # x轴只需要一个国家的数据就可以

# 设置y轴
line.add_yaxis("美国确诊人数",us_y,label_opts=LabelOpts(is_show=False)) # 这是让每个点的数据不出现
line.add_yaxis("日本确诊人数",jp_y,label_opts=LabelOpts(is_show=False))
line.add_yaxis("印度确诊人数",in_y,label_opts=LabelOpts(is_show=False))

# 设置全局配置项 标题和标题的位置
line.set_global_opts(
    title_opts=TitleOpts(title="2020年美日印三国疫情确诊人数",pos_left="center",pos_bottom="1%"))

# 生成图像
line.render("自主完成折线图.html") # 不要忘记加:html

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

效果:

(以上非真实数据)

四,生成地图

代码语言:javascript
复制
# 导包
import json
from pyecharts.charts import Map
from pyecharts.options import * # 一次性导入配置项的所有包

# 读取json数据
f = open("D:/疫情.txt","r",encoding="UTF-8")
data = f.read()
f.close()

# 将json数据转换成字典
data = json.loads(data)

# 拿到用于组成数据中元组的键
city_data = data["areaTree"][0]["children"][3]["children"]

# 键与值配对,设置好数据
# (因为需要的数据是:每个元素是元组的列表,这个元组的键是地区,值是每个地区的数据)
data_list =[]
for city_data_name in city_data:
    city_name = city_data_name["name"] + "市"  # 在每个城市后面加上个“市”
    city_comfirm = city_data_name["total"]["confirm"]  # 每个城市的确诊人数
    data_list.append((city_name,city_comfirm))  # 生成元组,加入到列表中

# 手动添加济源市的数据
data_list.append(("济源市",5))

# 生成地图对象
map = Map()

# 加入数据
map.add("河南省疫情地图",data_list,maptype="河南")

# 设置配置项
map.set_global_opts(
    title_opts=TitleOpts(
        title="河南省疫情地图"),  # 地图的title
    visualmap_opts=VisualMapOpts(
        is_show=True,  # 是否显示地图
        is_piecewise=True,  # 是否设置分段,下面就是如何分段(包括min,max,label,color)
        pieces= [
                {"min":1,"max": 9, "lable": "1~99人", "color": "#CCFFFF"},
                {"min": 10, "max": 99, "lable": "10~999人", "color": "#FFFF99"},
                {"min": 100, "max": 499, "lable": "100~499人", "color": "#FF9966"},
                {"min": 500, "max": 999, "lable": "500~9999人", "color": "#FF6666"},
                        ]
    )
)
# 生成地图
map.render("河南省疫情地图.html")

rgb颜色对照表(找颜色的16位代码):可以在AB173(网站)——前端去找

效果:

(以上非真实数据)

五,动态GDP图

时间图就是:不同的图片放在不同的位置,然后播放

代码语言:javascript
复制
# 动态GDP开发
# 导包
from pyecharts.charts import Bar, Timeline
from pyecharts.options import *  # 导入配置项
from pyecharts.globals import ThemeType  #导入主题

# 读取数据
f = open("D:/1960-2019全球GDP数据.csv","r",encoding="GB2312")
data = f.readlines()
f.close()

# 删除第一行无效数据
data.pop(0)
# 现在的数据是:[句子,句子]
# 我们希望得到的是:{year1:[[country1,gdp1],[country2,gdp2],[]],year2:[[],[]...}
data_dict = {}
for sentence in data:  # sentence 是字符串
    year = int(sentence.split(",")[0])
    country = sentence.split(",")[1]
    gdp = float(sentence.split(",")[2])
    # dict[key] = value 如果key不存在会创建
    # 我们用append在值(列表上追加),但是列表不存在会报错
    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())  # 得到的是[year1,year2...]
# 按时间遍历字典,获取信息,添加bar图
# 这是字典的结构:{year1:[[country1,gdp1],[country2,gdp2],[]],year2:[[],[]...}
for year in sorted_year_list:
    data_dict[year].sort(key=lambda element: element[1],reverse=True)
    top_country = data_dict[year][0:8]  # 截取前8个国家,已经是:[[],[]...]
    # 获取前八个国家的数据,添加到列表里面,准备给x轴和y轴使用
    x_data = []
    y_data = []
    for county_data in top_country:  # 这里拿到的是列表里面的元素[county,gdp]
        x_data.append(county_data[0])
        y_data.append(county_data[1]/100000000)
    # 创建柱状图
    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()
    bar.set_global_opts(
        title_opts=TitleOpts(title=f"{year}年世界top8国家GDP排名")
    )
    # 往时间线里面添加图表
    timeline.add(bar,str(year))

# 设置自动播放
timeline.add_schema(
    play_interval=500,
    is_timeline_show=True,
    is_loop_play=False,
    is_auto_play=True
)
# 生成图标
timeline.render("GDP动态图.html")

效果(就想象一下动态吧),以下是两张截图:

(以上非真实数据)

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-04-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一,json数据
    • 1,json数据的特点
      • 2,json数据与python数据间的转换
      • 二,pyecharts
      • 三,生成折线图
      • 四,生成地图
      • 五,动态GDP图
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档