matplotlib+basemap画出标记地图

参考地址:https://mp.weixin.qq.com/s/Mni6ZLGC5jlUzMVpglv6JA               https://www.cnblogs.com/ameile/p/6694982.html

1.首先建立一个字典用来存储每个省份的疫情状况,使用不同的颜色标记来区分

2.readshapefile为读取下载好的地图文件,源码中的原话为:

For example, if name='counties', self.counties will be a list of x,y vertices for each shape in map projection coordinates and self.counties_info will be a list of dictionaries with shape attributes. 程序中给入的值为prov,所以map1.prov_info为地图信息,map1.prov为多边形的坐标

from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt
from matplotlib.patches import Polygon
from matplotlib.collections import PatchCollection
from matplotlib.patches import PathPatch
import numpy as np


if __name__ == '__main__':
    info_dic = {}
    provinces = ['湖北','广东','浙江','河南','湖南','安徽','江西','江苏','重庆','山东','四川','北京','黑龙江','上海','福建','河北','陕西','广西','云南','海南','山西','贵州','辽宁','天津','甘肃','吉林','内蒙古','新疆','宁夏','香港','青海','台湾','澳门','西藏']
    nums =[29631,1151,1092,1073,879,830,771,492,468,466,405,337,331,299,261,218,213,210,141,136,119,109,107,94,83,80,58,49,49,36,18,18,10,1]
    colors = ['darkred','firebrick','indianred','lightcoral','lightsalmon']
    for i in range(len(provinces)):
        info_dic[provinces[i]] = str(nums[i])

    for name in info_dic.keys():
        # print(name)
        if int(info_dic[name])>=10000:
            info_dic[name]= 'darkred'
        elif 1000<int(info_dic[name])<9999:
            info_dic[name]= 'firebrick'
        elif 100<int(info_dic[name])<999:
            info_dic[name]= 'indianred'
        elif 10<int(info_dic[name])<99:
            info_dic[name]='lightcoral'
        else:
            info_dic[name]='lightsalmon'



    map1 =  Basemap(projection='lcc', width=7000000,height=5000000,
                       lat_0=35, lon_0=105)
    plt.figure(figsize=(12,9))
    map1.drawmapboundary(fill_color='aqua')
    map1.fillcontinents(color='#ddaa66',lake_color='aqua')
    map1.drawcoastlines()
    map1.readshapefile(r'map\gadm36_CHN_1', 'prov')
    #print(map1.prov_info)
    #print(map1.prov)  #列表
    #map1.readshapefile(r'f:\data\gadm36_TWN_shp\gadm36_TWN_0', 'taiwan') # 台湾地图要单独添加

    #print(list(zip(map1.prov_info, map1.prov)))

    ax = plt.gca()  #  获取当前子图
    for name in provinces:
        patch = []
        if name != '台湾':
            for info, shape in zip(map1.prov_info, map1.prov):  # 将每个省的地图信息与坐标合并成元组
                if name in info['NL_NAME_1']:  # map1.prov_info 中'NL_NAME_1': '遼寧|辽宁',
                    patch.append( Polygon(np.array(shape), closed=True))  #  将多边形顶点连接绘制多边形
            ax.add_collection(PatchCollection(patch, facecolor=info_dic[name],edgecolor='k', linewidths=1., zorder=2))

        # else:
        #     for info, shape in zip(map1.taiwan_info, map1.taiwan):
        #         if info['NAME_0'] == "Taiwan":
        #             patch.append( Polygon(np.array(shape), closed=True) )
        #     ax.add_collection(PatchCollection(patch, facecolor=info_dic['台湾']['color'], edgecolor='k', linewidths=1., zorder=2))



    plt.show()

Basemap是一个Python库,用于创建地理空间像,常用于科学可视化和GIS应用中。要在地图标记中国的重庆市,你可以按照以下步骤操作: 1. 首先,确保已经安装了`matplotlib`, `basemap`(已被官方弃用,推荐使用`cartopy`代替),以及`geopandas`等库。如果还没有安装,可以使用pip命令安装: ``` pip install matplotlib cartopy geopandas ``` 2. 导入所需的库: ```python import matplotlib.pyplot as plt import cartopy.crs as ccrs from cartopy.feature import NaturalEarthFeature import geopandas as gpd ``` 3. 加载中国行政区划数据: ```python # 下载中国行政区划数据(GeoPandas可用的数据源) gdf_china = gpd.read_file(gpd.datasets.get_path('naturalearth_lowres')) ``` 4. 筛选重庆市的数据: ```python chongqing = gdf_china[gdf_china.name == '重庆'] ``` 5. 创建 Basemap 或 Cartopy 地图并设置投影: ```python fig, ax = plt.subplots(figsize=(8, 6), subplot_kw={'projection': ccrs.PlateCarree()}) ``` 或者使用 Basemap (注意Basemap已不再维护): ```python import mpl_toolkits.basemap.pyproj as pyproj m = Basemap(projection='merc', llcrnrlat=29, urcrnrlat=32, llcrnrlon=103, urcrnrlon=107, resolution='l') ``` 6.地图上绘制重庆市边界: ```python if using_cartopy: chongqing.plot(column='name', ax=ax, facecolor='none', edgecolor='red') else: m.drawcoastlines() m.drawcountries() m.drawstates() m.drawcounties() chongqing.geometry.apply(lambda x: m.plot(x.exterior, color='red')) ``` 7. 显示地图: ```python plt.title('中国重庆市地图') plt.show() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值