传送门==>B站黑马python入门教程
目录
1. json数据格式

什么是Json
-
JSON 是一种轻量级的数据交互格式,可按照JSON指定格式去组织和封装数据
-
JSON本质上是一个带有特定格式的字符串
-
JSON就是一种在各个编程语言中的流通的数据格式,负责不同编程语言中的数据传递和交互,类似于
- 国际通用语言
- 普通话

JSON的数据格式要求比较严格,例如
{name:"张三",age:18,sex:"男"}
{name:"张三",age:18,sex:"男"},{name:"张三1",age:18,sex:"男"}
如何转换数据
python
# 导入 json 模块
import json
# 定义 json 字符串
json_str = '{"name":"张三","age":18,"sex":"男"},{name:"张三1",age:18,sex:"男"}'
# python转json,#包含中文时 需要设置ensure_ascii=False
json_ = json.dumps(json_str, ensure_ascii=False)
print(json_)
print(type(json_))
str = '[{"name":"张三","age":18,"sex":"男"}]'
# json转python
python_dict = json.loads(str)
print(python_dict)
print(type(python_dict))

2.pyecharts模块
- 若想要做出数据可视化效果图,可借助pyecharts模块完成
- Echarts 是一个基于 JavaScript 的开源可视化图表库,可以流畅的运行在 PC 和移动设备上,兼容当前绝大部分浏览器(IE8/9/10/11,Chrome,Firefox,Safari,Oprea,iOS,Android),提供直观,生动,可交互,可高度个性化定制的数据可视化图表。
https://pyecharts.org/
https://gallery.pyecharts.org/
折线图
python
"""
折线图基础
"""
# 导包,导入line功能来构建折线图对象;
from pyecharts.charts import Line
# 得到折线对象
line = Line()
# 添加X轴数据
line.add_xaxis(["1月","2月","3月","4月","5月","6月"])
# 添加Y轴数据
line.add_yaxis("折线图",[10,20,30,40,50,60])
# 生图
line.render("折线图.html")
在浏览器中打开


配置选项
- 全局配置
- 系列配置
python
"""
折线图基础
"""
# 导包,导入line功能来构建折线图对象;
from pyecharts.charts import Line
from pyecharts import options as opts
# 得到折线对象
line = Line()
# 添加X轴数据
line.add_xaxis(["1月","2月","3月","4月","5月","6月"])
# 添加Y轴数据
line.add_yaxis("折线图",[10,20,30,40,50,60])
# 设置全局配置项
line.set_global_opts(
# 标题;- pos_left左侧位置,-pos_bottom 底部位置;
title_opts=opts.TitleOpts(title="折线图",pos_left="center",pos_bottom="1%"),
# 图例;
legend_opts=opts.LegendOpts(is_show=True),
# 工具
toolbox_opts=opts.ToolboxOpts(is_show=True),
# 提示框;
tooltip_opts=opts.TooltipOpts(is_show=True),
)
# 生图
line.render("折线图.html")

案例练习
python
# 从资料包中获取数据
import json
# 进行处理处理,去除不规范的部分;
f_us = open("F:/pythonworkspace/startDemo/fileDemopath/美国.txt", "r", encoding="utf-8")
f_jp = open("F:/pythonworkspace/startDemo/fileDemopath/日本.txt", "r", encoding="utf-8")
f_in = open("F:/pythonworkspace/startDemo/fileDemopath/印度.txt", "r", encoding="utf-8")
us_data = f_us.read()
us_data = us_data.replace("jsonp_1629344292311_69436(", "")
us_data = us_data[:-2]
jp_data = f_jp.read()
jp_data = jp_data.replace("jsonp_1629350871167_29498(", "")
jp_data = jp_data[:-2]
in_data = f_in.read()
in_data = in_data.replace("jsonp_1629350745930_63180(", "")
in_data = in_data[:-2]
# 转换为python对象
py_us_dict = json.loads(us_data)
py_jp_dict = json.loads(jp_data)
py_in_dict = json.loads(in_data)
# trend 数据
us_trend_dict = py_us_dict["data"][0]["trend"]
jp_trend_dict = py_jp_dict["data"][0]["trend"]
in_trend_dict = py_in_dict["data"][0]["trend"]
# 日期数据 -2020年
us_date_list = us_trend_dict["updateDate"][:314]
jp_date_list = jp_trend_dict["updateDate"][:314]
in_date_list = in_trend_dict["updateDate"][:314]
us_y_data=us_trend_dict["list"][0]["data"][:314]
jp_y_data=jp_trend_dict["list"][0]["data"][:314]
in_y_data=in_trend_dict["list"][0]["data"][:314]
# 生图
from pyecharts.charts import Line
from pyecharts.options import TitleOpts
line = Line()
line.add_xaxis(us_date_list)
line.add_yaxis("美国确诊",us_y_data)
line.add_yaxis("日本确诊",jp_y_data)
line.add_yaxis("印度确诊",in_y_data)
# 标题
line.set_global_opts(
title_opts=TitleOpts(title="确诊案例分析折线图",
pos_left="center",
pos_bottom="1%"
)
)
line.render("案例折线图.html")
# 关闭文件
f_us.close()
f_jp.close()
f_in.close()

地图
案例
python
# 地图
from pyecharts.charts import Map
from pyecharts.options import VisualMapOpts
map = Map()
data = [
("北京", 100),
("上海", 80),
("广州", 60),
("深圳", 40),
("杭州", 30),
("西安", 20),
("武汉", 10),
("南京", 5),
("成都", 2),
("天津", 1),
]
map.add("地图", data, "china")
# 生图
map.render("地图.html")

全局配置项
视觉映射器配置
python
# 地图
from pyecharts.charts import Map
from pyecharts.options import VisualMapOpts
from pyecharts.options import TitleOpts
map = Map()
data = [
("北京", 100),
("上海", 80),
("广州", 60),
("深圳", 40),
("杭州", 30),
("西安", 20),
("武汉", 10),
("南京", 5),
("成都", 2),
("天津", 1),
]
map.add("地图", data, "china")
# 生图
# 设置全局配置项
map.set_global_opts(
title_opts=TitleOpts(title="地图"),
visualmap_opts=VisualMapOpts(
# 是否显示
is_show=True,
# 是否分段
is_piecewise=True,
# 分段
pieces=[ {"min": 1, "max": 10, "label": "1-10", "color": "#d94e5d"},
{"min": 10, "max": 20, "label": "10-20", "color": "#eac736"},
{"min": 20, "max": 30, "label": "20-30", "color": "#50a3ba"},
{"min": 30, "max": 40, "label": "30-40", "color": "#eac736"},
{"min": 40, "max": 50, "label": "40-50", "color": "#eac736"},
{"min": 50, "max": 60, "label": "50-60", "color": "#eac736"},
{"min": 60, "max": 70, "label": "60-70", "color": "#eac736"},]
),
)
map.render("地图.html")

案例
python
"""
案例疫情地图
"""
import json
from pyecharts.charts import Map
from pyecharts.options import TitleOpts, VisualMapOpts
# 读取数据文件;
f = open("F:/pythonworkspace/startDemo/fileDemopath/疫情.txt", "r", encoding="utf-8")
data =f.read()
f.close()
data_reverse = json.loads(data)
# 省份数据
data_list = data_reverse["areaTree"][0]["children"]
# 省份 确诊数据
real_data = []
for province_data in data_list :
province_name = province_data["name"]
province_confirm = province_data["total"]["confirm"]
real_data.append((province_name,province_confirm))
print(real_data)
# 创建地图对象;
map = Map()
map.add("疫情地图",real_data,"china")
map.set_global_opts(
title_opts=TitleOpts(title="疫情地图"),
visualmap_opts=VisualMapOpts(
# 是否显示
is_show=True,
# 是否分段
is_piecewise=True,
# 分段
pieces=[ {"min": 1, "max": 10, "label": "1-10", "color": "#d94e5d"},
{"min": 10, "max": 20, "label": "10-20", "color": "#eac736"},
{"min": 20, "max": 30, "label": "20-30", "color": "#50a3ba"},]
)
)
map.render("疫情地图.html")
print("生成完成")

柱状图
基础柱状图案例
python
"""
基础柱状图
"""
from pyecharts.charts import Bar
from pyecharts.options import *
# 创建柱状图对象
bar = Bar()
bar.add_xaxis(["衬衫","羊毛衫","雪纺衫","裤子","高跟鞋","袜子"])
bar.add_yaxis("商家A",[5,20,36,10,75,90])
bar.set_global_opts(
title_opts=TitleOpts(title="案例柱状图",
pos_left="center",
pos_bottom="1%"
),
visualmap_opts=VisualMapOpts(
# 是否显示
is_show=True,
# 是否分段
is_piecewise=True,
# 分段
pieces=[]
)
)
bar.render("案例柱状图.html")

时间线柱状图
TimeLine() -时间线

案例练习
python
"""
TimeLine() -时间线
"""
from pyecharts.charts import Timeline
from pyecharts.charts import Bar
from pyecharts.options import *
from pyecharts.globals import *
bar1 = Bar()
bar1.add_xaxis(["衬衫","羊毛衫","雪纺衫","裤子","高跟鞋","袜子"])
bar1.add_yaxis("价格",[5,25,36,10,75,6])
bar1.reversal_axis()
bar2 = Bar()
bar2.add_xaxis(["衬衫","羊毛衫","雪纺衫","裤子","高跟鞋","袜子"])
bar2.add_yaxis("价格",[3,20,36,16,56,3])
bar2.reversal_axis()
bar3 = Bar()
bar3.add_xaxis(["衬衫","羊毛衫","雪纺衫","裤子","高跟鞋","袜子"])
bar3.add_yaxis("价格",[2,20,36,56,109,9])
bar3.reversal_axis()
# 时间线对象
timeline = Timeline({"theme":"macarons"})
timeline.add(bar1, "2021年")
timeline.add(bar2, "2022年")
timeline.add(bar3, "2023年")
# 自动动态轮播
timeline.add_schema(
is_auto_play=True,#是否自动播放
play_interval=1000,#播放间隔
is_loop_play=True,#是否循环播放
is_timeline_show=True#是否显示时间线
)
timeline.render("时间线.html")
print("生成完成")

动态柱状图
列表sort方法
sorted函数可以对容器进行排序;但是无法完成指定的排序规则;
列表.sort(key=选择排序的方式函数,reverse=True|False)
- 参数
key,传入一个函数,表示将列表的每一个元素都传入函数中,返回排序的依据; - 参数
reverse:是否反转排序的结果,True:降序,False:升序;
例如在处理嵌套列表时,要对外层的列表进行排序,排序依据是内层列表中的第二个元素数字
- 带名函数形式
python
demo_list = [["A",18],["B",16],["C",19]]
# 排序方法
def choose_sort_key(item):
return item[1]
# 确定用哪个元素来排序
demo_list.sort(key=choose_sort_key)
print(demo_list)
- 匿名lambda形式
python
demo_list2 = [["A",18],["B",16],["C",19]]
demo_list2.sort(key=lambda item:item[1],reverse=True)
print(demo_list2)

绘图案例

python
"""
动态柱形图案例
"""
# 导包
import json
from pyecharts.charts import Bar
from pyecharts.charts.composite_charts import timeline
from pyecharts.options import *
from pyecharts.globals import *
from pyecharts.charts import Timeline
# 读取数据
f = open("F:/pythonworkspace/startDemo/fileDemopath/1960-2019全球GDP数据.csv", "r", encoding="GB2312")
local_data = f.readlines()
local_data.pop(0)# 首行标题不使用
f.close()
# 处理数据
data_dict = {}
for line in local_data:
line_list = line.split(",")
year = int(line_list[0])
gdp = float(line_list[2])
country = line_list[1]
try:
data_dict[year].append([country,gdp])
print("添加成功")
except KeyError:
data_dict[year] = []
data_dict[year].append([country, gdp])
print("添加成功")
timeline = Timeline({"theme":"macarons"})
# 排序
sorted_year = sorted(data_dict.keys())
for year in sorted_year:
data_dict[year].sort(key=lambda x:x[1],reverse=True)
# 当年前八名
data_list = data_dict[year][:8]
x_dat=[]
y_dat=[]
for country_data in data_list:
x_dat.append(country_data[0])
y_dat.append(country_data[1]/100000000)
bar = Bar()
bar.add_xaxis(x_dat)
bar.add_yaxis("GDP(亿元)",y_dat)
bar.reversal_axis()
timeline.add(bar, str(year))
# 自动动态轮播
timeline.add_schema(
is_auto_play=True, # 是否自动播放
play_interval=1000, # 播放间隔
is_loop_play=True, # 是否循环播放
is_timeline_show=True ) # 是否显示时间线)
timeline.render("GDP.html")
