1、value.txt
0,3.19
1,2.7
2,2.51
3,2.78
4,2.61
5,3.13
6,3.14
7,2.69
8,2.51
9,3.15
10,3.15
11,3.15
12,3.15
第一列是称是序号,第二列是其对应数值。
序号与城市对应如下:
0,南京市
1,徐州市
2,淮安市
3,盐城市
4,宿迁市
5,泰州市
6,扬州市
7,南通市
8,连云港市
9,镇江市
10,无锡市
11,苏州市
12,常州市
2、jsmap.svg 下载地址:
https://download.csdn.net/my (不能0积分我也hen蓝瘦,不过可以复制下面的内容)
用来生成地图,我采用的示例是江苏省的,只精确到市。
3、染色的颜色信息
推荐一个十六进制的颜色信息网站:http://zh.spycolor.com/
我们设定,数值大的区域使用深色染色,数值小的区域颜色浅。
可参考Windows下安装Python、matplotlib包 及相关
https://blog.csdn.net/mikasa3/article/details/78942650
1、bs4
原名是BeautifulSoup,后经修改。
如下:
# coding=utf-8
import sys
reload(sys)
sys.setdefaultencoding('utf8')
import csv
from bs4 import BeautifulSoup
def DrawBlockMap(file_name):
reader = csv.reader(open(file_name,'r'), delimiter = ",")
svg = open('jsmap.svg','r').read() #读取江苏省地图数据
Price = {}
price_only = []#记录各市的数值
sort_value = []#记录
sort_no = []#记录各市的排名
for row in reader:#遍历读取的文件每一行
try:
temp = row[0]#序号
price = float(row[1].strip())#价格
Price[temp] = price
price_only.append(price)
sort_value.append(price)
except:
pass
sort_value.sort()#对所有数值默认升序排序,计算记录各市的排名
for i in range(len(price_only)):
for j in range(len(sort_value)):
if (price_only[i] == sort_value[j]):
sort_no.append(j)#记录当前排名
break
soup = BeautifulSoup(svg,"lxml")
paths = soup.findAll('path')
#颜色列表
colors = ["#FFD0E7","#FFA0D0","#FF71B8","#FF41A0", "#FF1288", "#E10071", "#B20059", "#720039","#620031","#510029","#410021","#310018","#210010"]
path_style = 'font-size:12px;fill-rule:nonzero;stroke:#FFFFFF;stroke-opacity:1;stroke-width:0.1;stroke-miterlimit:4;stroke-dasharray:none;stroke-linecap:butt;marker-start:none;stroke-linejoin:bevel;fill:'
count = 0
for p in paths:
try:
color_class = sort_no[count]#根据排名染不同的颜色,排名越前说明值越小,所以颜色越浅
count += 1
except:
continue
color = colors[color_class]
p['style'] = path_style + color#改变地图对应区域的颜色
print soup.prettify()
if __name__=='__main__':
DrawBlockMap("value.txt")
若将文件保存命名为test.py,生成文件名为out_js_map.svg,则在py文件夹中命令行运行,输入:
python test.py > out_js_map.svg
如我们所设想的,数值大的区域颜色深,反之则颜色浅。