轻识Logo
目录

    Python-Geopandas 教你绘制中国地图

    本期我们试着使用Python-geopandas包绘制空间地图,主要的知识点如下:

    • geopandas 绘制中国地图
    • matplotlib add_axes()添加南海小地图
    • 绘图文件分享

    geopandas 读取中国地图文件

    geopandas提供了非常方便的read_file()方法用于读取geojson文件,我们直接进行默认投影(WGS84)的绘制,代码如下:

    file = r"中国省级地图GS(2019)1719号.geojson"
    nine = r"九段线GS(2019)1719号.geojson"
    china_main = gpd.read_file(file)
    china_nine = gpd.read_file(nine)
    fig, ax = plt.subplots(figsize=(12, 8),dpi=80)
    ax = china_main.plot(ax=ax)
    ax = china_nine.plot(ax=ax)

    可视化结果如下:

    我们进行投影转换(epsg=2343)和进行一些简单的设置,代码如下:

    fig, ax = plt.subplots(figsize=(12, 8),dpi=80)
    ax = china_main.geometry.to_crs(epsg=2343).plot(fc="white",ec="black",ax=ax)
    ax = china_nine.geometry.to_crs(epsg=2343).plot(ec="black",ax=ax)

    这里注意to_crs(epsg=2343) 就可以进行投影转换了。

    绘图数据操作

    接下来,我们将我们要绘制的数据读取、转换并绘制在地图上,数据预览如下:

    我们使用如下代码将其转换成具有地理信息的geopandas 格式数据:

    scattergdf = gpd.GeoDataFrame(
        scatter, geometry=gpd.points_from_xy(scatter.lon, scatter.lat),
        crs="EPSG:4326")
    scattergdf.head()

    结果如下:

    接下来再将其转换成 epsg=2343 投影下的数据:

    scattergdf_2343 = scattergdf.to_crs(epsg=2343, inplace=True)

    以上就完成的数据的处理操作了

    地图可视化绘制

    直接给出绘图代码,然后再进行解释。主要代码如下:

    fig, ax = plt.subplots(figsize=(8,5),dpi=200,)
    plt.rcParams['font.family'] = ['Times New Roman']

    ax = china_main.geometry.to_crs(epsg=2343).plot(fc="white",ec="black",linewidth=.8,ax=ax)
    ax = china_nine.geometry.to_crs(epsg=2343).plot(color="gray",linewidth=.9,ax=ax)

    for loc, size,class_name in zip(scattergdf_2343.geometry.representative_point(),\
                                    scattergdf_2343["data"],scattergdf_2343["class"]):
        ax.scatter(loc.x,loc.y,s=10*size,fc=class_color[class_name],ec="black",lw=.5,zorder=2) 
    #添加刻度线
    for spine in ['top','left',"bottom","right"]:
        ax.spines[spine].set_color("none")

    ax.set_xlim(china_nine_2343.geometry[0].x-500000, china_nine_2343.geometry[1].x)
    ax.set_ylim(china_nine_2343.geometry[0].y, china_nine_2343.geometry[1].y)
    ax.set_xticks([])
    ax.set_yticks([])
    #单独绘制图例散点
    ax.scatter([], [], c='#E21C21', s=30,  label='cluster1',ec="black",lw=.5) 
    ax.scatter([], [], c='#3A7CB5', s=30,  label='cluster2',ec="black",lw=.5)
    ax.scatter([], [], c='#51AE4F', s=30,  label='cluster3',ec="black",lw=.5)

    ax.scatter([], [], c='white', s=1*10,label='1', edgecolor='black',lw=.5)
    ax.scatter([], [], c='white', s=2*10,label='2', edgecolor='black',lw=.5)
    ax.scatter([], [], c='white', s=3*10,label='3', edgecolor='black',lw=.5)
    ax.scatter([], [], c='white', s=4*10,label='4', edgecolor='black',lw=.5)
    ax.scatter([], [], c='white', s=5*10,label='5', edgecolor='black',lw=.5)

    ax.legend(frameon=False,ncol=8,loc="upper center",
             fontsize=9,columnspacing=.2)

    ax.text(.91,-0.02,'\nVisualization by DataCharm',transform = ax.transAxes,
            ha='center', va='center',fontsize = 6,color='black')

    #添加南海小地图    
    ax_child = fig.add_axes([0.688, 0.125, 0.2, 0.2])
    ax_child = china_main.geometry.to_crs(epsg=2343).plot(ax=ax_child,
                                                            fc="white",
                                                            ec="black",)
    ax_child = china_nine.geometry.to_crs(epsg=2343).plot(ax=ax_child,
                                                            color="gray",
                                                            linewidth=.9,
                                                            )

    for loc, size,class_name in zip(scattergdf_2343.geometry.representative_point(),\
                                    scattergdf_2343["data"],scattergdf_2343["class"]):
        ax_child.scatter(loc.x,loc.y,s=10*size,fc=class_color[class_name],ec="black",lw=.5,zorder=2)

    ax_child.set_xlim(china_nine_2343.geometry[2].x, china_nine_2343.geometry[3].x)
    ax_child.set_ylim(china_nine_2343.geometry[2].y, china_nine_2343.geometry[3].y)
    # 移除子图坐标轴刻度,
    ax_child.set_xticks([])
    ax_child.set_yticks([])
    • add_axes() 添加南海小地图
    #添加南海小地图    
    ax_child = fig.add_axes([0.688, 0.125, 0.2, 0.2])
    ax_child = china_main.geometry.to_crs(epsg=2343).plot(ax=ax_child,
                                                            fc="white",
                                                            ec="black",)
    ax_child = china_nine.geometry.to_crs(epsg=2343).plot(ax=ax_child,
                                                            color="gray",
                                                            linewidth=.9,
                                                            )

    for loc, size,class_name in zip(scattergdf_2343.geometry.representative_point(),\
                                    scattergdf_2343["data"],scattergdf_2343["class"]):
        ax_child.scatter(loc.x,loc.y,s=10*size,fc=class_color[class_name],ec="black",lw=.5,zorder=2)

    ax_child.set_xlim(china_nine_2343.geometry[2].x, china_nine_2343.geometry[3].x)
    ax_child.set_ylim(china_nine_2343.geometry[2].y, china_nine_2343.geometry[3].y)
    # 移除子图坐标轴刻度,
    ax_child.set_xticks([])
    ax_child.set_yticks([])

    可以发现,除了显示范围的不同外,其他的和绘制主题部分的代码一致。

    • 单独添加图例
    #单独绘制图例散点
    ax.scatter([], [], c='#E21C21', s=30,  label='cluster1',ec="black",lw=.5) 
    ax.scatter([], [], c='#3A7CB5', s=30,  label='cluster2',ec="black",lw=.5)
    ax.scatter([], [], c='#51AE4F', s=30,  label='cluster3',ec="black",lw=.5)

    ax.scatter([], [], c='white', s=1*10,label='1', edgecolor='black',lw=.5)
    ax.scatter([], [], c='white', s=2*10,label='2', edgecolor='black',lw=.5)
    ax.scatter([], [], c='white', s=3*10,label='3', edgecolor='black',lw=.5)
    ax.scatter([], [], c='white', s=4*10,label='4', edgecolor='black',lw=.5)
    ax.scatter([], [], c='white', s=5*10,label='5', edgecolor='black',lw=.5)

    ax.legend(frameon=False,ncol=8,loc="upper center",
             fontsize=9,columnspacing=.2)

    这部分还是为了更好的定制化图例,希望大家可以掌握。

    最终,我们的可视化效果如下:

    关注 DataCharm 公众号,后台回复:地图文件 ,即可获取免费下载链接。

    注:该数据只限于练习交流,请勿用于科研、出版使用

    总结

    本期推文使用了Python-geopandas进行了中国地图的绘制,讲解了数据标记,投影转换等内容。但需指出的是:

    1. geopandas 的安装较为麻烦,建议使用 conda install --channel conda-forge geopandas 进行安装。
    2. Python 绘制空间可视化还是存在部分问题(无法较容易的添加如比例尺、指北针等空间绘图元素),也在进一步完善过程中。
    浏览 64
    点赞
    评论
    收藏
    分享

    手机扫一扫分享

    举报
    Python-geopandas 中国地图绘制
    Python爬虫与数据挖掘
    0
    ChinaMapForFlashFlash中国地图
    这是一个用来显示中国地图的 Flash 组件: 主要特性: 按照省份划分行政区域,显示每个省份
    ChinaMapForFlashFlash中国地图
    0
    ChinaMapForFlashFlash中国地图
    这是一个用来显示中国地图的Flash组件:主要特性:按照省份划分行政区域,显示每个省份的详细信息(内容通过XML自定义)支持HTML显示支持点击省份,打开网页链接支持事件监听(AS和JavaScrip
    ChinaMapForFlashFlash中国地图
    0
    教你一行代码自动绘制艺术画 (Discoart)
    Python实用宝典
    0
    教你一行代码自动绘制艺术画 (Discoart)
    Python客栈
    0
    一行代码教你绘制顶级期刊要求配图
    简说Python
    0
    教你利用Python绘制酷炫的词云图。
    俊红的数据分析之路
    0
    利用 Python 教你绘制冬奥吉祥物“冰墩墩”
    杰哥的IT之旅
    0
    Android使用svg构造交互式中国地图
    龙旋
    0
    点赞
    评论
    收藏
    分享

    手机扫一扫分享

    举报

    深圳SEO优化公司平湖设计网站哪家好海南网站推广工具黄冈百度爱采购哪家好贵阳设计公司网站公司朝阳推广网站海东高端网站设计价格长葛网页制作哪家好阳江seo哪家好南阳网站推广方案怒江网站改版周口网络推广哪家好巢湖模板推广哪家好德阳模板推广多少钱舟山网站定制多少钱韶关网站推广系统推荐哈尔滨seo价格开封SEO按天收费价格丽江网站定制公司随州网站排名优化推荐西宁推广网站哪家好绍兴关键词按天计费价格临汾网站设计公司临夏关键词排名公司广东网站建设玉林百度竞价推荐贺州网络推广价格惠州网站优化榆林网络营销哪家好来宾百度标王多少钱承德建设网站价格歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

    深圳SEO优化公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化