您现在的位置是:首页 > 技术教程 正文

【Python]】地图热力图如何绘制?(含源代码)

admin 阅读: 2024-03-22
后台-插件-广告管理-内容页头部广告(手机)

文章目录

  • 一、问题引入 & 使用地图的说明
    • 1.1 问题的引入
    • 1.2 使用地图的说明
  • 二、方法1
  • 三、方法2

一、问题引入 & 使用地图的说明

1.1 问题的引入

我们有一个中国各省份的数据集,要求绘制地图热力图,该怎么实现呢?

部分数据集如下:

在这里插入图片描述

最后两列表示经纬度。

1.2 使用地图的说明

特别提醒:文中尽量不用世界、全国地图,能用表格表达的尽量用表格表达!

如果一定要用,凡涉国界图件(国内部分地区、全国、世界部分地区、全球)必须使用国家测绘局地理信息局标准地图底图,所用底图边界要完全无修改(包括南海诸岛位置),为适应排版时图的缩放,比例尺一律用线划比例尺,而不用数字比例尺。

并在图题下注明“注:该图基于国家测绘地理信息局标准地图服务网站下载的审图号为GS(2016)xxxx 号的标准地图制作,底图无修改。”。

编辑部的核心要求是:使用国家测绘局地理信息局标准地图底图,所用底图边界要完全无修改。并未要求提供审图号,因此我们无需提交审图,只需按这条要求提供地图即可。

我认为,要想满足这个要求,需要做到以下几点:

(1)shapefile地图为官方提供。这样可以保证地图边界无误,坐标系无误。

(2)使用EPS格式的标准地图作为底图。EPS格式标准地图中的各项要素均可编辑,可以删除不需要的文字图层,可以改变色块填充的颜色、样式,同时可以保证出图清晰。

(3)将shapefile地图调整为投影坐标系,导出为EPS格式,叠加在不改变行政边界的标准地图上。

【能不用尽量不要用!】

二、方法1

# 创建Basemap对象 map = Basemap(llcrnrlon=75, llcrnrlat=15, urcrnrlon=135, urcrnrlat=55, projection='lcc', lat_1=33, lat_2=45, lon_0=105, resolution='l') # 绘制海岸线、边界和国家 map.drawcoastlines() map.drawcountries() map.drawstates() # 填充地图背景颜色 map.fillcontinents(color='lightgray', lake_color='white') # 绘制经纬线 map.drawparallels(range(-90, 91, 10), labels=[1, 0, 0, 0], fontsize=10, linewidth=0.5, color='gray') map.drawmeridians(range(0, 360, 10), labels=[0, 0, 0, 1], fontsize=10, linewidth=0.5, color='gray') # 将经纬度转换为Basemap坐标 x, y = map(data['long'].values, data['lat'].values) map.scatter(x, y, c=data['value'], cmap='hot_r', s=100, alpha=0.8) # 添加颜色条 plt.colorbar(label='Value') plt.title('Heatmap of Values in China') plt.show()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

这段代码使用了Basemap库来创建一个地图对象,并在地图上绘制了中国地区的热力图。

首先,创建了一个Basemap对象,指定了地图的经纬度范围(llcrnrlon, llcrnrlat, urcrnrlon, urcrnrlat),投影方式(projection)为兰勃特投影(‘lcc’),中心经纬度(lon_0)为105,以及分辨率(resolution)为低分辨率(‘l’)。

接下来,使用Basemap对象的方法绘制了海岸线、边界和国家的轮廓,使用了drawcoastlines()、drawcountries()和drawstates()方法。

然后,使用fillcontinents()方法填充地图的陆地颜色为灰色,水域颜色为白色。

接着,使用drawparallels()和drawmeridians()方法绘制经纬线,设置了经纬线的范围、标签位置、字体大小、线宽和颜色。

之后,将经纬度坐标转换为Basemap坐标,使用scatter()方法在地图上绘制散点图,其中x和y分别表示经纬度坐标转换后的Basemap坐标,c表示散点的颜色,s表示散点的大小,alpha表示散点的透明度。

最后,使用colorbar()方法添加颜色条,指定了颜色条的标签(label),并使用title()方法设置地图的标题。最后使用show()方法显示地图。

展示的结果为:

在这里插入图片描述
【注意:上图只是一个示范案例,并非用于学术等其他领域】

三、方法2

from pyecharts import options as opts from pyecharts.charts import Map lst1 = [] lst2 = [] for i in range(len(data)): lst1.append(data.iloc[i, 1]) lst2.append(int(data.iloc[i, 2])) c = ( Map(init_opts=opts.InitOpts(width = "1600px", height = "800px")) .add("城市", [list(z) for z in zip(lst1, lst2)], "china") .set_global_opts( title_opts=opts.TitleOpts(title = "中国产业)"), visualmap_opts=opts.VisualMapOpts(max_ = 60000, is_piecewise=True, pieces=[ {"min": 0, "max": 10000, "label": "0-10000", "color": "#FFB6C1"}, {"min": 10000, "max": 20000, "label": "10000-20000", "color": "#FF6666"}, {"min": 20000, "max": 30000, "label": "20000-30000", "color": "#FF6600"}, {"min": 30000, "max": 40000, "label": "30000-40000", "color": "#FF0000"}, {"min": 40000, "max": 100000, "label": "40000-100000", "color": "#990033"} ]) ) .render("产业.html") )
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

这段代码使用了pyecharts库来创建一个中国地图,并将数据中的城市和产业值添加到地图上。

首先,创建了两个空列表lst1和lst2,用于存储数据中的城市名称和产业值。

然后,通过循环遍历数据中的每一行,将城市名称和产业值分别添加到lst1和lst2中。其中,data.iloc[i, 1]表示数据中第i行的第2列(城市名称),data.iloc[i, 2]表示数据中第i行的第3列(产业值)。

接下来,导入所需的库和模块,并创建一个Map对象c。在Map对象的初始化参数中,设置了地图的宽度和高度为"1600px"和"800px"。

然后,使用add()方法将数据添加到地图中。其中,通过列表解析生成了城市和产业值的二维列表,[list(z) for z in zip(lst1, lst2)]表示将lst1和lst2中对应位置的元素打包成元组,并转换为列表。"china"表示地图的区域范围为中国。

接着,使用set_global_opts()方法设置全局配置项。title_opts用于设置地图的标题,visualmap_opts用于设置视觉映射选项。在visualmap_opts中,max_指定了视觉映射的最大值,is_piecewise=True表示视觉映射为分段模式,pieces列表用于设置分段的取值范围、标签和颜色。

最后,使用render()方法将地图渲染为HTML文件,并指定文件名为"产业.html"。

执行以上代码后,将生成一个名为"产业.html"的HTML文件,其中包含了中国地图以及对应城市的产业值颜色映射。

在这里插入图片描述
【注意:上图只是一个示范案例,并非用于学术等其他领域】

标签:
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

在线投稿:投稿 站长QQ:1888636

后台-插件-广告管理-内容页尾部广告(手机)
关注我们

扫一扫关注我们,了解最新精彩内容

搜索