参加数学建模比赛时,很多题目——诸如统计类、数据挖掘类、环保类、建议类的题目总会涉及到地理相关的情景,往往要求我们制作与地图相关的可视化内容。如下图,这是21年亚太赛的那道塞罕坝的题目,期间涉及到温度、降水和森林覆盖率等问题:
实际上,有很多方法可以完成论文写作中对可视化图片的需求,如Python、MATLAB、Arcgis、echarts、一些BI平台、Excel甚至PPT。本帖介绍几种博主在本科期间参赛用到的方法~
一.pyecharts包绘制地图
首先我们需要安装一个pyecharts包:
pip install pyecharts
如下,可以简单地绘制一张中国地图的可视化效果:
from pyecharts.charts import Map
map=Map() #创建地图对象
data=[
("北京省",11),
("山西省",14),
("黑龙江省",23),
("浙江省",33),
("湖南省",43)
] #数据格式:列表中以元组构成
map.add("原始形态",data,"china")#实际上默认值就是china
map.render()
生成的文件默认叫render.html,就在原路径:
一个小注意点是:现在必须写成“山西省”的格式,写成山西是不显示数据的!换句话说,key值必须和地图中的名字对应~
设置全局选项后可以展示颜色:
from pyecharts.charts import Map
from pyecharts.options import VisualMapOpts
map=Map() #创建地图对象
data=[
("北京省",11),
("山西省",14),
("黑龙江省",23),
("浙江省",33),
("湖南省",43)
] #数据格式:列表中以元组构成
map.set_global_opts(
visualmap_opts=VisualMapOpts(
is_show=True
)
)
map.add("原始形态",data,"china")#实际上默认值就是china
map.render()
一方面不太好看,另一方面热力条可能会有问题,需要手动调整一下:
map.set_global_opts(
visualmap_opts=VisualMapOpts(
is_show=True
is_piecewise=True,#允许手动~
pieces=[
{"min":11,"max":20,"label":"11-20","color":"#0000ff"},
{"min":21,"max":30,"label":"11-20","color":"#00ff00"},
{"min":31,"max":40,"label":"11-20","color":"#ff0000"},
{"min":41,"max":50,"label":"11-20","color":"#00ccff"}
]
)
)
除了全国的大地图,还可以绘制省级、市级的地图:
from pyecharts.charts import Map
from pyecharts.options import VisualMapOpts
map=Map() #创建地图对象
data=[
("太原市",100),
("大同市",100)
] #数据格式:列表中以元组构成
map.add("原始形态",data,"山西")
map.render()
from pyecharts.charts import Map
from pyecharts.options import VisualMapOpts
map=Map() #创建地图对象
data=[
("迎泽区",100)
] #数据格式:列表中以元组构成
map.add("原始形态",data,"太原")
map.render()
而针对外国地图,需要下载额外的扩展包,这里就不演示了。此外由于众所周知的原因,说真的网页中的图片绘制的地图在字符的配置上显得不那么美观。因此这种绘图方式仁者见仁智者见智,针对于JSON数据繁多的情况下可以考虑使用~
二.PPT法绘制国内地图
相比之下,博主还是喜欢用“笨办法”来完成地图可视化,毕竟数模比赛的核心并非是可视化技术多么高超,在其他情况一样的情况下——变得好看些才是王道~
进入阿里云地图可视化平台
可以通过手动的方式,亦可以通过右侧的粒度选择器来选中:此处我们选择粒度为市级别的山西省:
当然可以下载JSON格式的数据,然后使用python或者MATLAB等方法——此处博主选择svg格式。SVG 是一种基于 XML(可扩展标记语言)的矢量图形格式。它用于描述二维图形,通过使用 XML 标签和属性来定义图形的形状、颜色、位置、大小等各种属性。与位图不同,矢量图形是由数学公式定义的图形元素组成,所以 SVG 图形在放大或缩小后不会出现失真的情况,能够始终保持清晰的图像质量。下载后,通常情况下是可以通过默认浏览器打开的~
当然了,这玩意可以直接拖入到PPT中:
右键点击取消组合,然后放大:
然后就可以对单独的一块操作啦~
市级单位亦可下载,如下是粒度为区级的太原市——实际上不能再降低了~
这种方式就需要各位手动进行颜色填充了,如果颜色区间相对较少,还是个不错的选择哦~
三.PPT法绘制国外地图
使用国外的地图需要另外一个网站:
同样下载后也是svg的格式,同样的方式各位手动填充即可。不过该网站貌似只可以做到省级或者说是州级的单位~
四.Matlab的geoplot和geobubble函数
geoplot,顾名思义——就是绘制一张地理图呗~不过和之前的这几种图不一样:之前几种都是以国家、省份、城市亦或区县级别的单位,来展示某种数值上的差异。而geoplot则更多用来展示某种地理元素的分布情况,比如某条路径~
geoplot(10,112)
两个参数分别是纬度和经度,然后会生成以该数值为中心的地图:
出于美观考虑可以添加底图:
geobasemap streets
其实还有很多别的参数,但是其他的需要联网(也就是必须用正版的)~
这里我们可以绘制一下从太原去北京再去上海、苏州的路线(经纬度可以自行查阅~)
lat=[37.87016999999997,39.788078,31.141900000000028,31.29094800000002];
lon=[112.562367,116.32634499999995,121.80916400000001,120.65650900000003];
%分别为4个城市的纬度和经度
geoplot(lat,lon,"B-o","LineWidth",2)
geobasemap streets
而geobubble,亦可顾名思义——地理泡泡?实际上就是以地图为底的气泡图。举个例子,我们此时要显示上述4个城市的常住人口数,只需要再添加额外的权重参数也即人数即可:
lat=[37.87016999999997,39.788078,31.141900000000028,31.29094800000002];
lon=[112.562367,116.32634499999995,121.80916400000001,120.65650900000003];
%分别为4个城市的纬度和经度
weights=[545.44,2185.8,2487.45,1295.8];
lat1=37.8;
lon1=112.56;
value=11000000;
gb=geobubble(lat,lon,weights)
gb.BubbleColorList = summer(1);%选择颜色
geolimits([28 43],[110 125])%限制一下经纬度
geobasemap streets
如上就是本文全部内容,各位可以根据所选题目的实际情况灵活调整战术~