Python中的JSON:
# json数据的格式可以是:
{"name":"admin","age":18}
# 也可以是:
[{"name":"admin","age":18},{"name":"root","age":16},{"name":"张三","age":20}]
Python中的内置模块json能够实现Python数据和JSON数据的转换
# 导入json模块
import json
# 准备符合格式json格式要求的python数据
# data = 3.14
# data = "abc123"
# data = [1, 2.2, "a", ["list"], ("tuple",), {"dict": "dict"}]
# data = (1, 2.2, "a", ["list"], ("tuple",), {"dict": "dict"})
data = {"int": 1, "float": 2.2, "str": "a", "list": ["list"], "tuple": ("tuple",),"dict": {"dict": "dict"}}
# 通过dumps方法把python数据转化为了json数据
data = json.dumps(data)
print(f"json数据:{data}")
# 通过loads方法把json数据转化为了python数据
data = json.loads(data)
print(f"Python数据:{data}")
"""
转换结果:
data = 3.14
json数据:3.14
Python数据:3.14
data = "abc123"
json数据:"abc123"
Python数据:abc123
data = [1, 2.2, "a", ["list"], ("tuple",), {"dict": "dict"}]
json数据:[1, 2.2, "a", ["list"], ["tuple"], {"dict": "dict"}]
Python数据:[1, 2.2, 'a', ['list'], ['tuple'], {'dict': 'dict'}]
data = (1, 2.2, "a", ["list"], ("tuple",), {"dict": "dict"})
json数据:[1, 2.2, "a", ["list"], ["tuple"], {"dict": "dict"}]
Python数据:[1, 2.2, 'a', ['list'], ['tuple'], {'dict': 'dict'}]
data = {"int": 1, "float": 2.2, "str": "a", "list": ["list"], "tuple": ("tuple",),"dict": {"dict": "dict"}}
json数据:{"int": 1, "float": 2.2, "str": "a", "list": ["list"], "tuple": ["tuple"], "dict": {"dict": "dict"}}
Python数据:{'int': 1, 'float': 2.2, 'str': 'a', 'list': ['list'], 'tuple': ['tuple'], 'dict': {'dict': 'dict'}}
"""
注意:①集合数据类型无法转换成JSON,强制转换会报TypeError: Object of type set is not JSON serializable
,同时列表、元组、字典不能嵌套集合,否则也无法转换成JSON数据②字典转换还是字典,列表转换还是列表,字符串转换还是字符串,但是元组转换是列表
什么是pyecharts?
pyecharts是为了让Python能够能够更好地实现数据可视化而开发的工具。因为Python十分有利于处理数据,ECharts是一款很优秀的数据可视化的开源工具,两者相结合就诞生了pyecharts(pyecharts堪称数据可视化神器)。
pyecharts官网:pyecharts - A Python Echarts Plotting Library built with love.
pyecharts画廊:Gallery(该网站含有大量pyecharts的应用示例)
什么是Echarts?
ECharts是一款基于JavaScript的数据可视化图表库,提供直观,生动,可交互,可个性化定制的数据可视化图表。ECharts最初由百度团队开源,并于2018年初捐赠给Apache基金会,成为ASF孵化级项目。
ECharts官网:Apache ECharts
学习网站:ECharts 教程 | 菜鸟教程 (runoob.com)
下载安装
生成一个折线图
test.py:
from pyecharts.charts import Line
# 得到折线图对象
line = Line()
# 添加x轴数据
line.add_xaxis(['张三', '李四', '王五'])
# 添加y轴数据
line.add_yaxis('分数', [66, 88, 99])
# 生成图表
line.render()
运行render.html文件:
pyecharts相关配置属性
pyecharts模块中有很多的配置选项,常用到2个类别的选项:全局配置选项和系列配置选项
from pyecharts.charts import Line
from pyecharts.options import TitleOpts, LegendOpts, ToolboxOpts, VisualMapOpts
# 得到折线图对象
line = Line()
# 添加x轴数据
line.add_xaxis(['张三', '李四', '王五', '赵六', '钱七', '王八'])
# 添加y轴数据
line.add_yaxis('分数', [10, 20, 30, 40, 50, 60])
# 设置全局配置项
line.set_global_opts(
# 设置标题
title_opts=TitleOpts(title="学生成绩单", pos_left="center", pos_bottom="0%"),
# 是否展示图例(默认是True)
legend_opts=LegendOpts(is_show=True),
# 是否展示工具箱(默认是False)
toolbox_opts=ToolboxOpts(is_show=True),
# 是否展示色卡(默认是没有该属性,一旦设置了该属性,无论是否取值都会展示不同颜色)
visualmap_opts=VisualMapOpts(is_show=True)
)
# 生成图表
line.render()
PS:详情请参考pyecharts官网
示例:疫情折线图
数据文件结构:
Python脚本:
import json
from pyecharts.charts import Line
from pyecharts.options import TitleOpts, LegendOpts, ToolboxOpts, VisualMapOpts
# 读取文件中的JSON数据
f_us = open('E:/project/Python/day02_数据可视化/txt/美国.txt', 'r', encoding='utf-8')
f_jp = open('E:/project/Python/day02_数据可视化/txt/日本.txt', 'r', encoding='utf-8')
f_in = open('E:/project/Python/day02_数据可视化/txt/印度.txt', 'r', encoding='utf-8')
us_data = f_us.read()
jp_data = f_jp.read()
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字符串转换成Python数据
us_dict = json.loads(us_data)
jp_dict = json.loads(jp_data)
in_dict = json.loads(in_data)
# 获取key(trend)
trend_dict = us_dict['data'][0]['trend']
# trend_dict = jp_dict['data'][0]['trend']
# trend_dict = in_dict['data'][0]['trend']
# 获取key(updateDate)
updateDate_dict = trend_dict['updateDate']
# 只获取2020年的数据(x轴的数据,表示日期)
us_x_data = updateDate_dict[:314]
# 获取y轴的数据
# 获取key(list)
list_list = trend_dict['list']
# 获取确诊数据(y轴的数据)
us_y_data = list_list[0]['data']
# 得到折线图对象
line = Line()
# 添加x轴数据(x轴的数据是共用的,所以只需要添加一份即可)
line.add_xaxis(us_x_data)
# 添加y轴数据(label_opts=LegendOpts(is_show=False)不显示折线图中点的数值)
line.add_yaxis('美国确证人数', us_y_data, label_opts=LegendOpts(is_show=False))
# 设置全局配置项
line.set_global_opts(
# 设置标题
title_opts=TitleOpts(title="2020年美国确诊人数折线图", pos_left="center", pos_bottom="0%"),
# 是否展示图例(默认是True)
legend_opts=LegendOpts(is_show=True),
# 是否展示工具箱(默认是False)
toolbox_opts=ToolboxOpts(is_show=True),
# 是否展示色卡(默认是没有该属性,一旦设置了该属性,无论是否取值都会展示不同颜色)
visualmap_opts=VisualMapOpts(is_show=True)
)
# 生成图表
line.render()
示例1:绘制全国各省疫情确诊人数分布地图
数据文件的结构:
python脚本:
import json
from pyecharts.charts import Map
from pyecharts.options import VisualMapOpts
# 读取文件中的JSON数据
f = open('E:/project/Python/day03_地图/txt/疫情.txt', 'r', encoding='utf-8')
data = f.read()
# 关闭文件
f.close()
# 将JSON数据转成Python数据(字典类型)
data_dict = json.loads(data)
# 取得各省的疫情数据(列表类型)
province_list = data_dict['areaTree'][0]['children']
# 取得各省的确证数据()
data_list = list()
for province_data in province_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(
visualmap_opts=VisualMapOpts(
# 是否展示色卡(默认是True)
is_show=True,
# 色卡是否以分块矩形展示(默认是False)
is_piecewise=True,
# 设置不同数量对应的颜色展示
pieces=[
{"min": 1, "max": 9, "Label": "1-9", "color": "#CCFFFF"},
{"min": 10, "max": 99, "labe1": "10-99人", "color": "#FFFF99"},
{"min": 100, "max": 499, "1abe1": "99-499人", "co1or": "#FF9966"},
{"min": 500, "max": 999, "1abe1": "499-999人", "co1or": "#FF6666"},
{"min": 1000, "max": 9999, "1abe1": "1000-9999人", "c010r": "#CC3333"},
{"min": 10000, "1abe1": "10000以上", "col0r": "#990033"}
])
)
# 生成地图
map.render()
示例2:绘制省级的确诊人数分布地图
import json
from pyecharts.charts import Map
from pyecharts.options import VisualMapOpts
# 读取文件中的JSON数据
f = open('E:/project/Python/day03_地图/txt/疫情.txt', 'r', encoding='utf-8')
data = f.read()
# 关闭文件
f.close()
# 将JSON数据转成Python数据(字典类型)
data_dict = json.loads(data)
# 取得湖南省的疫情数据(列表类型)
province_list = data_dict['areaTree'][0]['children'][5]['children']
# 取得湖南省各市的确诊数据
data_list = list()
for province_data in province_list:
city_name = province_data['name'] + '市' # 城市名称
city_confirm = province_data['total']['confirm'] # 确诊人数
data_list.append((city_name, city_confirm))
# 获取地图对象
map = Map()
# 添加数据
# 手动添加湘西土家族苗族自治州的确诊人数(因为给出的JSON数据并没有该地区的疫情数据)
data_list.append(('湘西土家族苗族自治州', 3))
map.add('湖南省各市确诊人数', data_list, "湖南")
# 设置全局配置项
map.set_global_opts(
visualmap_opts=VisualMapOpts(
# 是否展示色卡(默认是True)
is_show=True,
# 色卡是否以分块矩形展示(默认是False)
is_piecewise=True,
# 设置不同数量对应的颜色展示
pieces=[
{"min": 1, "max": 9, "Label": "1-9", "color": "#CCFFFF"},
{"min": 10, "max": 99, "labe1": "10-99人", "color": "#FFFF99"},
{"min": 100, "max": 499, "1abe1": "99-499人", "co1or": "#FF9966"},
{"min": 500, "max": 999, "1abe1": "499-999人", "co1or": "#FF6666"},
{"min": 1000, "max": 9999, "1abe1": "1000-9999人", "c010r": "#CC3333"},
{"min": 10000, "1abe1": "10000以上", "col0r": "#990033"}
])
)
# 生成地图
map.render()
示例1:静态柱状图
from pyecharts.charts import Bar
from pyecharts.options import TitleOpts, LegendOpts, ToolboxOpts, VisualMapOpts, LabelOpts
"""
演示基础的柱状图
"""
# 获取柱状图对象
bar = Bar()
# 添加x轴数据
bar.add_xaxis(['美国', '中国', '日本'])
# 添加y轴数据(position='right',将数值标签设置在右边,默认是在上边)
bar.add_yaxis('GDP', [30, 20, 10], label_opts=LabelOpts(position='right'))
# 反转x和y轴
bar.reversal_axis()
# 设置全局配置项
bar.set_global_opts(
# 设置标题
title_opts=TitleOpts(title="中美日三国GDP", pos_left="center", pos_bottom="0%"),
# 是否展示图例(默认是True)
legend_opts=LegendOpts(is_show=True),
# 是否展示工具箱(默认是False)
toolbox_opts=ToolboxOpts(is_show=True),
# 是否展示色卡(默认是没有该属性,一旦设置了该属性,无论是否取值都会展示不同颜色)
visualmap_opts=VisualMapOpts(is_show=True)
)
# 生成柱状图
bar.render()
示例2:时间线柱状图
from pyecharts.charts import Bar, Timeline
from pyecharts.globals import ThemeType
from pyecharts.options import *
# 获取柱状图对象
bar1 = Bar()
bar2 = Bar()
bar3 = Bar()
# 添加x轴数据
bar1.add_xaxis(['美国', '中国', '日本'])
bar2.add_xaxis(['美国', '中国', '日本'])
bar3.add_xaxis(['美国', '中国', '日本'])
# 添加y轴数据(position='right',将数值标签设置在右边,默认是在上边)
bar1.add_yaxis('GDP', [30, 10, 15], label_opts=LabelOpts(position='right'))
bar2.add_yaxis('GDP', [40, 20, 20], label_opts=LabelOpts(position='right'))
bar3.add_yaxis('GDP', [45, 30, 25], label_opts=LabelOpts(position='right'))
# 反转x和y轴
bar1.reversal_axis()
bar2.reversal_axis()
bar3.reversal_axis()
# 创建时间线对象
timeline = Timeline(
# 设置时间线主题
{'theme': ThemeType.WHITE}
)
# 添加三个时间点,每个时间点对应一张柱状图
timeline.add(bar1, '2010年GDP')
timeline.add(bar2, '2015年GDP')
timeline.add(bar3, '2020年GDP')
# 自动播放设置
timeline.add_schema(
# 设置自动播放的间隔时间
play_interval=1000,
# 自动播放是否显示时间线(默认是True)
is_timeline_show=True,
# 是否自动播放(默认是False)
is_auto_play=True,
# 是否循环自动播放(默认是False)
is_loop_play=True
)
# 通过时间线对象生成柱状图
timeline.render()
测试3:1960年~2019年各国GDP动态变化柱状图
前置知识
列表.sort(key=选择排序依据的函数, reverse=True|False) # 降序排序
sort
方法示例代码:
lists = [[1, 2, 3], [1, 1, 1], [1, 3, 2]]
def key(element):
# 按照元素的第2个数据进行排序(也就是索引号为1)
return element[1]
print(lists) # [[1, 2, 3], [1, 1, 1], [1, 3, 2]]
lists.sort(key=key, reverse=True) # 非匿名函数
# lists.sort(key=lambda element: element[1], reverse=True) # 匿名函数
print(lists) # [[1, 3, 2], [1, 2, 3], [1, 1, 1]]
数据文件结构:
1960年~2019年各国GDP动态变化柱状图:
from pyecharts.charts import Bar, Timeline
from pyecharts.options import *
from pyecharts.globals import ThemeType
# 读取文件中的数据
f = open('E:/project/Python/day04_动态柱状图/resources/1960-2019全球GDP数据.csv', 'r', encoding='gbk')
data_lines = f.readlines()
f.close()
# 处理读取的数据
data_lines.pop(0) # 删除第一条数据
# 将字符串数据转成Python数据(字典)
data_dict = dict()
for line in data_lines:
year = int(line.split(',')[0])
country = line.split(',')[1]
gdp = float(line.split(',')[2])
# 将数据封装到字典中({year:[[国家,gdp], [国家,gdp]...], year:[[国家,gdp], [国家,gdp]...] ...})
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)
# 取gdp前8的国家(因为国家太多了,有两百多个国家和地区)
year_data = data_dict[year][0:8]
x_data = []
y_data = []
# 遍历每一年这八个国家的数据,同时赋值x和y轴
for country_gdp in year_data:
x_data.append(country_gdp[0]) # x轴为国家
y_data.append(country_gdp[1] / 100000000) # y轴为该国gdp
# 获取柱状图对象,构建柱状图
bar = Bar()
# 让高数据在上面
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}年全球前8GDP排行榜')
)
# 添加时间点
timeline.add(bar, str(year))
# 设置自动播放
timeline.add_schema(
play_interval=500,
is_timeline_show=True,
is_auto_play=True,
is_loop_play=True
)
# 生成动态GDP柱状图
timeline.render("1960-2019全球GDP前8国家.html")
参考文章
- ECharts 教程 | 菜鸟教程 (runoob.com)
- 【JSON是什么】&【JSON的基本使用】
- 【pyecharts教程】应该是全网最全的教程了~ - Heywhale.com