Python、MATLAB和PPT完成数学建模竞赛中的地图绘制

发布于:2025-03-20 ⋅ 阅读:(16) ⋅ 点赞:(0)

参加数学建模比赛时,很多题目——诸如统计类、数据挖掘类、环保类、建议类的题目总会涉及到地理相关的情景,往往要求我们制作与地图相关的可视化内容。如下图,这是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法绘制国内地图

相比之下,博主还是喜欢用“笨办法”来完成地图可视化,毕竟数模比赛的核心并非是可视化技术多么高超,在其他情况一样的情况下——变得好看些才是王道~

访问网站:DataV.GeoAtlas地理小工具系列

进入阿里云地图可视化平台

可以通过手动的方式,亦可以通过右侧的粒度选择器来选中:此处我们选择粒度为市级别的山西省:

        当然可以下载JSON格式的数据,然后使用python或者MATLAB等方法——此处博主选择svg格式。SVG 是一种基于 XML(可扩展标记语言)的矢量图形格式。它用于描述二维图形,通过使用 XML 标签和属性来定义图形的形状、颜色、位置、大小等各种属性。与位图不同,矢量图形是由数学公式定义的图形元素组成,所以 SVG 图形在放大或缩小后不会出现失真的情况,能够始终保持清晰的图像质量。下载后,通常情况下是可以通过默认浏览器打开的~

当然了,这玩意可以直接拖入到PPT中:

右键点击取消组合,然后放大:

 然后就可以对单独的一块操作啦~

 市级单位亦可下载,如下是粒度为区级的太原市——实际上不能再降低了~

这种方式就需要各位手动进行颜色填充了,如果颜色区间相对较少,还是个不错的选择哦~ 

三.PPT法绘制国外地图

使用国外的地图需要另外一个网站:

Free SVG Maps - amCharts

同样下载后也是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


如上就是本文全部内容,各位可以根据所选题目的实际情况灵活调整战术~