正值毕业季,同窗好友们大部分都签约工作了;还有的准研究生们,在今天2.20日也查询到自己考研成绩,希望大家都心想事成,去到满意的地方,开始新的生活。
这两天班长做了一个小统计,毕业去向表(大致是姓名和目前状态签约XXX
,考研XXX
)
嗯,都是听过或没听过名字的公司或学校名!
一个校园内,我们很近;天南海北,我们很远!
我们都来自重庆交通大学-物联网工程专业,我们大多数的选择去到了上海、杭州、深圳、四川、重庆。
地图上的距离好像也不是那么远!有空,还可以聚聚~
以下是地图绘制的过程~
一、地图绘制
- 语言python
- 基于xlrd插件处理表格
- 百度地图api定位地点
- pyecharts绘制地图
二、过程
1. 基于xlrd插件处理表格
表格数据大致三类:
提取出表格姓名和已签约公司或考研学校,将学生信息存入集合中
[ ['小红', '四川XX集团'], ['小明', '广州XX电子有限公司'],['小吴', ''], ['小王', '重庆大学']]
#!/usr/bin/env python3
# -*- coding:utf-8 -*-
import xlrd
def read_xsls(xlsx_path):
list = []
# 打开excel文件,创建一个workbook对象,book对象也就是fruits.xlsx文件,表含有sheet名
rbook = xlrd.open_workbook(xlsx_path)
# sheets方法返回对象列表,[<xlrd.sheet.Sheet object at 0x103f147f0>]
rbook.sheets()
# xls默认有3个工作簿,Sheet1,Sheet2,Sheet3
rsheet = rbook.sheet_by_index(0) # 取第一个工作簿
# 循环工作簿的所有行
for row in rsheet.get_rows():
student_column = row[0] # 姓名所在的列
student_value = student_column.value # 姓名名
if student_value != '姓名': # 排除第一行
state_column = row[3] # 公司所在的列
state_value = state_column.value
sign = str(state_value)[0:2]
if sign == '签约':
company = str(state_value)[2:]
list.append([student_value, company])
# 打印
print(student_value, "\t", company)
if sign == '考研':
school = str(state_value)[2:]
list.append([student_value, school])
# 打印
print(student_value, "\t", school)
if sign == '求职':
list.append([student_value, ''])
print(student_value, "\t", state_value)
return list
if __name__ == '__main__':
xlsx_path = './data.xlsx'
studentlist = read_xsls(xlsx_path)
print("读取学生信息:", studentlist)
2. 百度地图api定位地点
首先需要在百度地图注册账号获得ak(appkey)应用秘钥,
步骤:
进入控制台-》应用管理-》创建应用
- 强调:选择
浏览器端
(python采用request访问机制,模拟浏览器进行请求定位) - 白名单:* (所有域名可使用此ak秘钥)
获得你的ak秘钥:
百度api-python使用如下:采取requests模拟浏览器访问api获得返回值
#!/usr/bin/env python3
# -*- coding:utf-8 -*-
import json
import requests
import urllib.parse
url = 'http://api.map.baidu.com/geocoding/v3/'
ak = "36RTGvTpxEdBHAZL817U5PSIGffRmwOe"#你的ak秘钥
def getGPS(addr):
data1 = {
"address": addr
}
data2 = {
'output': 'json',
'ak': ak
}
query_string1 = urllib.parse.urlencode(data1)
query_string2 = urllib.parse.urlencode(data2)
getUrl = url + '?' + query_string1 + '&' + query_string2
result = (json.loads(requests.get(getUrl).text)["result"])[
"location"] # {'lng': XX.XXXXXXXXXXX, 'lat': XX.XXXXXXXXXXXXXX}
lng = result["lng"]
lat = result["lat"]
print((lng, lat))
return lng, lat
getGPS("重庆交通大学")
返回经纬度:(106.54271560556826, 29.65925719891873)
3. pyecharts绘制地图
安装echarts和中国地图:
pip install pyecharts
pip install echarts-countries-pypkg
pip install echarts-china-provinces-pypkg
pip install echarts-china-cities-pypkg
使用方法:
#!/usr/bin/env python3
# -*- coding:utf-8 -*-
import urllib.parse
from pyecharts.charts import Geo
from pyecharts import options as opts
from pyecharts.globals import ChartType, SymbolType
from pyecharts.types import LineStyle
def draw_geo():
g = Geo()
g.add_schema(maptype="china")
# 加入自定义的点,格式为
g.add_coordinate('geo', 106.54271560556826, 29.65925719891873)
# 为自定义的点添加属性
g.add('geo', [('geo', 51)],
type_=ChartType.EFFECT_SCATTER,)
g.set_series_opts(label_opts=opts.LabelOpts(is_show=False))
g.set_global_opts(title_opts=opts.TitleOpts(title="自定义点"))
# 在 html(浏览器) 中渲染图表
g.render('render.html')
print("绘图成功保存在render.html")
draw_geo()
效果图:
三、完整代码
#!/usr/bin/env python3
# -*- coding:utf-8 -*-
import xlrd
import json
import requests
import urllib.parse
from pyecharts.charts import Geo
from pyecharts import options as opts
from pyecharts.globals import ChartType, SymbolType
from pyecharts.types import LineStyle
url = 'http://api.map.baidu.com/geocoding/v3/'
ak = "36RTGvTpxEdBHAZL817U5PSIGffRmwOe"
# 获取经纬度方法
def getGPS(addr):
data1 = {
"address": addr
}
data2 = {
'output': 'json',
'ak': ak
}
query_string1 = urllib.parse.urlencode(data1)
query_string2 = urllib.parse.urlencode(data2)
getUrl = url + '?' + query_string1 + '&' + query_string2
result = (json.loads(requests.get(getUrl).text)["result"])[
"location"] # {'lng': XX.XXXXXXXXXXX, 'lat': XX.XXXXXXXXXXXXXX}
lng = result["lng"]
lat = result["lat"]
#print((lng, lat))
return lng, lat
# 读取表格
def read_xsls(xlsx_path):
list = []
# 打开excel文件,创建一个workbook对象,book对象也就是fruits.xlsx文件,表含有sheet名
rbook = xlrd.open_workbook(xlsx_path)
# sheets方法返回对象列表,[<xlrd.sheet.Sheet object at 0x103f147f0>]
rbook.sheets()
# xls默认有3个工作簿,Sheet1,Sheet2,Sheet3
rsheet = rbook.sheet_by_index(0) # 取第一个工作簿
# 循环工作簿的所有行
for row in rsheet.get_rows():
student_column = row[0] # 姓名所在的列
student_value = student_column.value # 姓名名
if student_value != '姓名': # 排除第一行
state_column = row[3] # 公司所在的列
state_value = state_column.value
sign = str(state_value)[0:2]
if sign == '签约':
company = str(state_value)[2:]
list.append([student_value, company])
# 打印
#print(student_value, "\t", company)
if sign == '考研':
school = str(state_value)[2:]
list.append([student_value, school])
# 打印
#print(student_value, "\t", school)
if sign == '求职':
list.append([student_value, ''])
#print(student_value, "\t", state_value)
return list
# 批量标经纬度
def get_positions(list):
list_GPS = []
for item in list:
place = item[1]
# print(place)
if len(place) != 0:
lng, lat = getGPS(place)
list_GPS.append([item[0], item[1], lng, lat])
# print(list_GPS)
return list_GPS
# 绘图
def draw_geo(list_GPS):
g = Geo()
g.add_schema(maptype="china")
for item in list_GPS:
# 加入自定义的点,格式为
g.add_coordinate(item[0][0:1], item[2], item[3])
# 为自定义的点添加属性
g.add(item[0][0:1], [(item[0][0:1], item[1])],
type_=ChartType.EFFECT_SCATTER,)
g.set_series_opts(label_opts=opts.LabelOpts(is_show=False),
linestyle_opts=opts.LineStyleOpts(2))
g.set_global_opts(title_opts=opts.TitleOpts(title="物联网1601班"))
# 在 html(浏览器) 中渲染图表
g.render('render.html')
print("绘图成功保存在render.html")
if __name__ == '__main__':
xlsx_path = './data.xlsx'
studentlist = read_xsls(xlsx_path)
print("读取学生信息:", studentlist)
list_GPS = get_positions(studentlist)
print("获取学生信息有效定位:", list_GPS)
draw_geo(list_GPS)
效果:
如果还需要美化,可以修改g.set_series_opts()
这一部分哦!
最后,