由于课题的需要,需要根据各省,市的指标数据在地图上进行差异颜色标记,以实现更好的可视化表达。
本人对R较为熟悉,遂打算先用R实现需求。
计算机环境:MacBook Pro (Retina, 13-inch, Early 2015)
软件环境:RStudio Version 1.1.414 – © 2009-2018 RStudio, Inc.
install.packages("maps")
install.packages("mapdata")
library(maps)
library(mapdata)
map("china")---绘制中国地图
其中map()函数还可以加上很多参数,在这里就不一一详述,具体的用法只需问号之。然而仔细看一看这张地图你会发现重庆市和四川省仍然是浑然一体,可见该地图的数据应该是有些年头了。下面通过以下方法解决这个问题,绘制完美的中国地图(也不完美,缺少澳门特别行政区)
install.packages("sp")
install.packages("maptools")
library(sp)
library(maptools)
x<-readShapePoly('/Users/bi-wsc/Desktop/doing/china/bou2_4p.shp')
在这里下载中国地图的 GIS 数据,这是一个压缩包,完全解压后包含三个文件(bou2_4p.dbf、bou2_4p.shp 和 bou2_4p.shx),将这三个文件解压到同一个目录下,然后安装maptools包,运行如下程序:
plot(x)
自此,已经绘制出了完整的中国地图;但是在实际使用的过程中,我们往往会根据自己的需要对地图中的某些省份着以特定的颜色,这时就可以通过调节plot命令中的col参数来予以实现。然而为了清楚地说明这部分的内容,我需要插播一段 R 绘制地图的原理。
getColor = function(mapdata, provname, provcol, othercol){
f = function(x, y) ifelse(x %in% y, which(y == x), 0);
colIndex = sapply(iconv(x@data$NAME, from="CP936",to="UTF-8"),f, provname);
col = c(othercol, provcol)[colIndex + 1];
return(col);
}
mydata<-read.csv("/Users/bi-wsc/Desktop/province.csv",header = T)
provname<-mydata[,c(1)]
pop<-mydata[,c(2)]
provcol <-rgb(red = 1 - pop/max(pop)/2, green = 1-pop/max(pop)/2, blue = 0)
plot(x,col = getColor(x, provname, provcol, "white"), xlab = "", ylab = "")
翻了无数文档后,终于是将第一阶段的图形绘制出来了。然而,第二阶段想实现动态交互式绘图,却卡在某个细节上动不了(关键是文档太少了,也终于明白一定要拿一门学习人数最多的语言进行入门,比如python是何等的重要!)
计算机环境:window10系统,内存16G
软件环境:Anaconda,用的数据分析专属Jupyter notebook;
我是从python,到pythoncharm,感觉pycharm适合做大型项目和网络爬虫,很多数据科学的包需要单独下载,并且下载时难免遇到报错(解决起来闹心,关键是拉低学习一门语言的热情!)后来就找到了Anaconda,并学会使用Jupyter notebook进行数据分析。
闲话少说,上代码:
#Anaconda Prompt(包管理器)下安装包:
pip install pyecharts
pip install echarts-china-provinces-pypkg
pip install echarts-china-cities-pypkg
安装完毕,再Jupyter notebook下导入包
from pyecharts import Map
import pandas as pd
data=[("广东",10430.03),("山东",9579.31),("河南",9402.36),("四川",8041.82),("江苏",7865.99),("河北",7185.42),("湖南",6568.37),("安徽",5950.1),("浙江",5442),("湖北",5723.77),("广西",4602.66),("云南",4596.6),("江西",4456.74),("辽宁",4374.63),("黑龙江",3831.22),("陕西",3732.74),("山西",3571.21),("福建",3552),("重庆",2884),("贵州",3476.65),("吉林",2746.22),("甘肃",2557.53),("内蒙古",2470.63),("上海",2301.391),("台湾",2316.2),("新疆",2181.33),("北京",1961.2),("天津",1293.82),("海南",867.15),("香港",709.76),("青海",562.67),("宁夏",630.14),("西藏",300.21),("澳门",55.23)]
你可能在导入Map包时报错:
1,报错原因,网上大多数文章都说是没有安装地图包,而我们安装了!
2,安装pyecharts时实际上是有标红的,你可以回溯代码;解决方法:
pip uninstall pyecharts
pip install wheel
pip install pyecharts==0.1.9.4
安装完成,以下就在Jupyter notebook环境下进行操作:
from pyecharts import Map
import pandas as pd
data=[("广东",10430.03),("山东",9579.31),("河南",9402.36),("四川",8041.82),("江苏",7865.99),("河北",7185.42),("湖南",6568.37),("安徽",5950.1),("浙江",5442),("湖北",5723.77),("广西",4602.66),("云南",4596.6),("江西",4456.74),("辽宁",4374.63),("黑龙江",3831.22),("陕西",3732.74),("山西",3571.21),("福建",3552),("重庆",2884),("贵州",3476.65),("吉林",2746.22),("甘肃",2557.53),("内蒙古",2470.63),("上海",2301.391),("台湾",2316.2),("新疆",2181.33),("北京",1961.2),("天津",1293.82),("海南",867.15),("香港",709.76),("青海",562.67),("宁夏",630.14),("西藏",300.21),("澳门",55.23)]
data=pd.DataFrame (data)
data.columns=['city','popu']
print (data)
map=Map("各省市人口数", "单位:万人", title_color="#fff", title_pos="center", width=1200, height=600, background_color='#404a59')
attr=data['city']
value=data['popu']
print (map)
map.add("", attr, value, visual_range=[min(value), max(value)],visual_text_color="#000", symbol_size=15,is_visualmap=True,is_label_show=True,label_pos = 'bottom')
map.render()
从excel导入的数据,注意省市名称是有规范的,按照规范来写!不如不能有省,市字眼!不能有超过3个字的地名
from pyecharts import Map
import pandas as pd
from pandas import Series,DataFrame
data=DataFrame(pd.read_excel('C:/Users/baihua/Desktop/province.xlsx'))
data=pd.DataFrame (data)
data.columns=['city','popu','order','a','b']
map=Map("各省注册用户数", "单位:人", title_color="#fff", title_pos="center", width=1200, height=600, background_color='#404a59')
attr=data['city']
value=data['popu']
map.add("", attr, value, visual_range=[min(value), max(value)],visual_text_color="#000", symbol_size=15,is_visualmap=True,is_label_show=True,label_pos = 'bottom')
map.render('各省注册用户数.html')
这里要提醒大家,一定要注意,安装完地图包以后一定要重启jupyter notebook,不然是无法显示地图的。
动态地图连接在此:
往下看各市的数据可视化:
很多时候要生成图像,需要关闭服务器,或是关闭Jupyter,或是刷新环境变量重新执行命令,才能解决最后生成图形的一步!
并且生成了html网页动态图,你可能也得关闭浏览器再重新启动才能完成下载;再网页图右边可以下载静态图!
from pyecharts import Geo
data = [
("海门", 9),("鄂尔多斯", 12),("招远", 12),("舟山", 12),("齐齐哈尔", 14),("盐城", 15),
("赤峰", 16),("青岛", 18),("乳山", 18),("金昌", 19),("泉州", 21),("莱西", 21),
("日照", 21),("胶南", 22),("南通", 23),("拉萨", 24),("云浮", 24),("梅州", 25),
("文登", 25),("上海", 25),("攀枝花", 25),("威海", 25),("承德", 25),("厦门", 26),
("汕尾", 26),("潮州", 26),("丹东", 27),("太仓", 27),("曲靖", 27),("烟台", 28),
("福州", 29),("瓦房店", 30),("即墨", 30),("抚顺", 31),("玉溪", 31),("张家口", 31),
("阳泉", 31),("莱州", 32),("湖州", 32),("汕头", 32),("昆山", 33),("宁波", 33),
("湛江", 33),("揭阳", 34),("荣成", 34),("连云港", 35),("葫芦岛", 35),("常熟", 36),
("东莞", 36),("河源", 36),("淮安", 36),("泰州", 36),("南宁", 37),("营口", 37),
("惠州", 37),("江阴", 37),("蓬莱", 37),("韶关", 38),("嘉峪关", 38),("广州", 38),
("延安", 38),("太原", 39),("清远", 39),("中山", 39),("昆明", 39),("寿光", 40),
("盘锦", 40),("长治", 41),("深圳", 41),("珠海", 42),("宿迁", 43),("咸阳", 43),
("铜川", 44),("平度", 44),("佛山", 44),("海口", 44),("江门", 45),("章丘", 45),
("肇庆", 46),("大连", 47),("临汾", 47),("吴江", 47),("石嘴山", 49),("沈阳", 50),
("苏州", 50),("茂名", 50),("嘉兴", 51),("长春", 51),("胶州", 52),("银川", 52),
("张家港", 52),("三门峡", 53),("锦州", 54),("南昌", 54),("柳州", 54),("三亚", 54),
("自贡", 56),("吉林", 56),("阳江", 57),("泸州", 57),("西宁", 57),("宜宾", 58),
("呼和浩特", 58),("成都", 58),("大同", 58),("镇江", 59),("桂林", 59),("张家界", 59),
("宜兴", 59),("北海", 60),("西安", 61),("金坛", 62),("东营", 62),("牡丹江", 63),
("遵义", 63),("绍兴", 63),("扬州", 64),("常州", 64),("潍坊", 65),("重庆", 66),
("台州", 67),("南京", 67),("滨州", 70),("贵阳", 71),("无锡", 71),("本溪", 71),
("克拉玛依", 72),("渭南", 72),("马鞍山", 72),("宝鸡", 72),("焦作", 75),("句容", 75),
("北京", 79),("徐州", 79),("衡水", 80),("包头", 80),("绵阳", 80),("乌鲁木齐", 84),
("枣庄", 84),("杭州", 84),("淄博", 85),("鞍山", 86),("溧阳", 86),("库尔勒", 86),
("安阳", 90),("开封", 90),("济南", 92),("德阳", 93),("温州", 95),("九江", 96),
("邯郸", 98),("临安", 99),("兰州", 99),("沧州", 100),("临沂", 103),("南充", 104),
("天津", 105),("富阳", 106),("泰安", 112),("诸暨", 112),("郑州", 113),("哈尔滨", 114),
("聊城", 116),("芜湖", 117),("唐山", 119),("平顶山", 119),("邢台", 119),("德州", 120),
("济宁", 120),("荆州", 127),("宜昌", 130),("义乌", 132),("丽水", 133),("洛阳", 134),
("秦皇岛", 136),("株洲", 143),("石家庄", 147),("莱芜", 148),("常德", 152),("保定", 153),
("湘潭", 154),("金华", 157),("岳阳", 169),("长沙", 175),("衢州", 177),("廊坊", 193),
("菏泽", 194),("合肥", 229),("武汉", 273),("大庆", 279)]
geo = Geo("全国主要城市空气质量", "data from pm2.5", title_color="#fff",
title_pos="center", width=1000,
height=600, background_color='#404a59')
attr, value = geo.cast(data)
geo.add("", attr, value, visual_range=[0, 200], maptype='china',visual_text_color="#fff",
symbol_size=10, is_visualmap=True)
geo.render("全国主要城市空气质量.html")#生成html文件
geo#直接在notebook中显示
动态地图连接;geo包就是专门绘制各市的(不能绘制省哦!),并且效果如下(是圆圈不是地理区域哦!)
我们可以利用geo包绘制一个省的市级单位用户数,也可以绘制京津冀发展圈,长三角,珠三角等城市圈,注意位置民称不要出错!
以下看各县区的地图分布:
from pyecharts import Map
districts = ['运河区', '新华区', '泊头市', '任丘市', '黄骅市', '河间市', '沧县', '青县', '东光县', '海兴县', '盐山县', '肃宁县', '南皮县', '吴桥县', '献县', '孟村回族自治县']
areas = [109.92, 109.47, 1006.5, 1023.0, 1544.7, 1333.0, 1104.0, 968.0, 730.0, 915.1, 796.0, 525.0, 794.0, 600.0, 1191.0, 387.0]
map_1 = Map("沧州市图例-各区面积", width=1200, height=600)
map_1.add("", districts, areas, maptype='沧州', is_visualmap=True, visual_range=[min(areas), max(areas)],
visual_text_color='#000', is_map_symbol_show=False, is_label_show=True)
map_1