在上一篇文章(https://www.cdsy.xyz/computer/programme/Python/230823/cd45618.html)中爬取了6W+条json数据,接下来通过2D可视化来分析这些数据。需要使用的是matplotlib模块。
之前我们获取了一个大学名字对应url的txt,通过大学名字去6w条数据中检索同一学校的各地区招生数进行统计
先随便拿一条数据观察一下
data列表是我们要关心的数据,上图中表示有13个专业的数据
plan则是招生人数
代码:
import json
import matplotlib.pyplot as plot
f=open('D:/PyGaokaopai/majorinfo.txt','r',encoding='utf-8')
datastr=f.read()
dataList = []
#获取6w+条json数据转化为字典
for str in datastr.split('\n'):
data = json.loads(str)
dataList.append(data)
area = {'黑龙江':'东北','吉林':'东北','辽宁':'东北','上海':'华东','江苏':'华东','浙江':'华东','安徽':'华东','福建':'华东','江西':'华东','山东':'华东','北京':'华北'
, '天津': '华北','山西':'华北','河北':'华北','内蒙古':'华北','河南':'华中','湖北':'华中','湖南':'华中','广东':'华南','广西':'华南','海南':'华南','重庆':'西南'
, '四川': '西南','贵州':'西南','云南':'西南','西藏':'西南','陕西':'西北','甘肃':'西北','青海':'西北','宁夏':'西北','新疆':'西北'}
#获取3054个学校名字
def getSchoolNameList():
f1 = open('schoolurl.txt', 'r', encoding='utf-8')
schoolName = []
while True:
try:
line = f1.readline()
name = line.split(',')[0]
schoolName.append(name)
except Exception as e:
pass
if (not line):
break
f1.close()
return schoolName
#画图并保存
def saveImg(school,areanum):
labels = areanum.keys()
values = areanum.values()
fig = plot.figure()
plot.rcParams['font.sans-serif']=['SimHei']
p = plot.pie(values,labels=labels,autopct='%1.2f%%', startangle=90,pctdistance=0.6,labeldistance=1.1)
plot.title(school)
plot.savefig('D:/PyGaokaopai/img/{}.png'.format(school))
fig.tight_layout()
schoolList = getSchoolNameList()
for school in schoolList:
areanum = {'东北': 0, '华东': 0, '华北': 0, '华中': 0, '华南': 0, '西南': 0, '西北': 0}
for data in dataList:
if data['data'][0]['school'] == school:
for dic in data['data']:
areanum[area[dic['city']]]+=int(dic['plan'])
saveImg(school,areanum)
注意在画图时的这两行代码,用于自动调整图区的大小以及间距,使所有的绘图及其标题、坐标轴标签等都可以不重叠的完整显示在画布上。不然会导致画多张图是字体重叠,第二张图上会有第一张图的信息!!
fig = plot.figure()
#...
fig.tight_layout()
最后是一共3054张图