📝前言: 这篇文章主要记录一下使用pyecharts生成GDP折线图的步骤和过程
什么是json
数据?
JSON
(JavaScript Object Notation)是一种轻量级的数据交换格式,易于阅读和编写,同时也易于机器解析和生成。它是基于 JavaScript 的对象表示法,但也可以在其他编程语言中使用。
很抽象,对于我们初学python来说只需要了解: 它就像一个中转站,其他语言如C语言,python可以转换成json数据,而json数据又可以被转换成其他语言 (从而实现把C语言的数据转换成python的数据)
json
本质上就是有特定格式的字符串,它的类型是字符串
json的数据格式要求很严格,一般是下面两种:
(这看起来就像是:1,字典;2,以字典为元素的列表)
使用 dumps
(转json)和loads
(转python)
当json
数据规范的时候(像上面两种形式),我们就可以将其转换成python
数据
当python
数据符合json的格式的时候,我们也可以将其转换成json
数据
方法如下:
(注意:python数据转换成json的时候,中文会被转换成Unicode的字符)
如果想要显示中文,则需要把dumps
中的第二个参数ensure_ascii
设置成False
:
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.org
以及pyecharts-gallery:gallery.pyecharts.org
# 导包
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()
效果:
(以上非真实数据)
# 导包
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开发
# 导包
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")
效果(就想象一下动态吧),以下是两张截图:
(以上非真实数据)
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有