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


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

    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文件,其中包含了中国地图以及对应城市的产业值颜色映射。

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

  • 相关阅读:
    UE MotionBlur源码解析
    简悦+Logseq 搭建本地化个人知识库
    Netty 学习:通信协议和编解码
    18天读完368页,靠着这份Alibaba面试通关秘籍,成功闯关“字节跳动”
    HTML 灵活布局(display: flex)
    【每日两题】day 01 组队竞赛 & 删除公共字符
    [JavaScript] 用电脑计算圆周率评估计算性能
    从TCP到Socket,彻底理解网络编程是怎么回事
    5359: 【图论】有向图连接边数(图的遍历前置)
    【面试题】JS第七种数据类型Symbol详解
  • 原文地址:https://blog.csdn.net/wzk4869/article/details/130900984