本文示例代码及文件已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes

1 简介

  我们在绘制某些地图时,为了凸显出每个独立的区域,需要满足拓扑着色要求,即所有相邻的区域不可以用同一种颜色绘制,以前的手绘地图需要绘制者自行思考设计具体的着色规则,而现如今通过计算机的辅助,我们可以快速生成大量的着色方案。

  今天我们就来学习配合geopandas如何快速实现地图的拓扑着色。

2 基于mapclassify的地图拓扑着色

  对于着色方案的生成,我们需要使用到mapclassify这个第三方库,以前我的geopandas系列文章分层设色篇也介绍过其中的诸多功能,而本文需要使用到其特殊的greedy功能。

  以中国县级单元矢量边界数据为例,它包含了共2900个县级单元的行政区划面矢量要素:

  对于这样一个典型的面要素众多的地图,利用mapclassify.greedy(),我们可以基于面要素之间的邻接拓扑关系,快速生成一定配色数量的方案出来,greedy()的主要参数如下:

  • gdf:GeoDataFrame型,用于传入待处理的地理数据框
  • strategy:str型,用于设定拓扑着色所采取的具体策略,默认为balanced(这也是QGIS中拓扑着色所使用的方法),其余可选策略有'largest_first''random_sequential''smallest_last''independent_set''connected_sequential_bfs''connected_sequential_dfs''connected_sequential''saturation_largest_first''DSATUR'等,详细介绍见https://networkx.github.io/documentation/stable/reference/algorithms/generated/networkx.algorithms.coloring.greedy_color.html
  • balance:str型,当strategy='balanced'时,用于设定如何进行“平衡”着色,默认为'count',可选项如下,其中除了'count'方式以外,其余方式均需要输入的GeoDataFrame为投影坐标系:
    • count:尽量保持每种颜色对应的面要素数量平衡
    • area:尽量保持每种颜色对应的面要素面积之和平衡
    • centroid:尽量保持每种颜色对应的面要素之间重心距离平衡
    • distance:尽量保持每种颜色对应的面要素之间拓扑距离平衡
  • min_colors:int型,当strategy='balanced'时,用于设置色彩方案至少的色彩数量,最后运算产生的色彩划分结果可能会大于这个参数
  • sw:str型,用于设定拓扑邻接关系判定策略,'rook'表示共边邻接'queen'表示共点邻接,默认为'queen'
  • min_distance:数值型,默认为None,有时由于数据质量、精度的原因,可能会导致肉眼看起来的邻接实际上仍然存在一定的“间距”,这时就可以使用min_distance参数来设定距离阈值来帮助greedy捕捉相邻面要素关系,即面要素两两之间拓扑距离小于min_distance时也视作“邻接”

  知晓了greedy()的主要参数后,我们下面来演示如何使用它来辅助制作拓扑着色地图。

  首先我们需要向greedy()中传入对应的面要素GeoDataFramegreedy()会根据我们的参数设定为每一个面生成一个标签,我们只需要将此标签列作为绘图着色映射列即可,可以看到最终得到的标签方案中共有7种不同标签,虽然按照四色问题的猜想,任何拓扑着色地图只需要4种颜色即可完成色彩填充,但在有限的计算时间内,greedy()给出了还不错的方案:

  按照标签进行颜色分配:

  放大仔细发现,每个邻接的区域的确实现了颜色不重合:

  而如果你希望用自定义色彩值来配合标签字段进行映射,则可以参考我下面的做法,将具体的颜色值譬如16进制色彩字符串传入color参数,这里使用到以前介绍过多次的配色库palettable


  以上就是本文的全部内容,欢迎在评论区与我进行讨论~

(数据科学学习手札133)利用geopandas绘制拓扑着色地图的更多相关文章

  1. (数据科学学习手札146)geopandas中拓扑非法问题的发现、诊断与修复

    本文示例代码已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 大家好我是费老师,geopandas作为在Pyt ...

  2. (数据科学学习手札111)geopandas 0.9.0重要新特性一览

    本文示例文件已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 就在几天前,geopandas释放了其最新正式版 ...

  3. (数据科学学习手札129)geopandas 0.10版本重要新特性一览

    本文示例代码及文件已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 就在前不久,我们非常熟悉的Python地理 ...

  4. (数据科学学习手札89)geopandas&geoplot近期重要更新

    本文示例代码及数据已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 最近一段时间(本文写作于2020-07-1 ...

  5. (数据科学学习手札139)geopandas 0.11版本重要新特性一览

    本文示例代码已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 大家好我是费老师,就在几天前,geopandas ...

  6. (数据科学学习手札75)基于geopandas的空间数据分析——坐标参考系篇

    本文对应代码已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 在上一篇文章中我们对geopandas中的数据结 ...

  7. (数据科学学习手札55)利用ggthemr来美化ggplot2图像

    一.简介 R中的ggplot2是一个非常强大灵活的数据可视化包,熟悉其绘图规则后便可以自由地生成各种可视化图像,但其默认的色彩和样式在很多时候难免有些过于朴素,本文将要介绍的ggthemr包专门针对原 ...

  8. (数据科学学习手札42)folium进阶内容介绍

    一.简介 在上一篇(数据科学学习手札41)中我们了解了folium的基础内容,实际上folium在地理信息可视化上的真正过人之处在于其绘制图像的高度可定制化上,本文就将基于folium官方文档中的一些 ...

  9. (数据科学学习手札40)tensorflow实现LSTM时间序列预测

    一.简介 上一篇中我们较为详细地铺垫了关于RNN及其变种LSTM的一些基本知识,也提到了LSTM在时间序列预测上优越的性能,本篇就将对如何利用tensorflow,在实际时间序列预测任务中搭建模型来完 ...

随机推荐

  1. 巩固javaweb第十五天

    巩固内容: 单选按钮: 在注册功能中,用户选择学历使用的是单选按钮,并且是多个单选按钮,每个选项对 应一个单选按钮,用户只能选择其中一个,这多个单选按钮的格式相同.如果用户要输入 的信息只有少数几种可 ...

  2. layui 弹窗中 分页展示table

    1. 需求:点击查看更多,展示该类别 所有数据,并分页 2. 参考文档: (1)https://www.jianshu.com/p/40da11ebae66 (2) https://blog.csdn ...

  3. 用户信息查询系统_daoImpl

    package com.hopetesting.dao.impl;import com.hopetesting.dao.UserDao;import com.hopetesting.domain.Us ...

  4. java上传图片或文件

    转载至:http://www.xdx97.com/#/single?bid=8b351a73-922c-eadc-512e-9e248a3efde9 前端通过form表单用post方式提交文件,后台进 ...

  5. Selenium和PhantomJS

    Selenium Selenium是一个Web的自动化测试工具,最初是为网站自动化测试而开发的,类型像我们玩游戏用的按键精灵,可以按指定的命令自动操作,不同是Selenium 可以直接运行在浏览器上, ...

  6. 【力扣】剑指 Offer 50. 第一个只出现一次的字符

    在字符串 s 中找出第一个只出现一次的字符.如果没有,返回一个单空格. s 只包含小写字母. 示例: s = "abaccdeff"返回 "b" s = &qu ...

  7. EntityFramework Core (一)记一次 .net core 使用 ef 6

    使用传统的sql去操作数据库虽然思路更加清晰,对每一步数据库读写操作都能监控到,但是对大数据存储,或存储规则复杂的程序就需要编写大量的SQL语句且不易维护..orm大大方便了复杂的数据库读写操作, 让 ...

  8. 下载requests库

    下载requests库 第一步:找到python的安装位置,可以从下面的图中找到 第二步:复制scripts文件夹的位置 第三步:win+r打开cmd cd 到scripts文件夹的位置 第四步:运行 ...

  9. Jsp/Servlet文件的上传和下载

    文件上传的入门 文件上传的步骤:       总结实现思路: 1.创建核心上传类ServletFileUpload,这个时候需要一个工厂类 2.创建磁盘工厂类对象DiskFileItemFactory ...

  10. 关于input单选框的radio属性

    最近在做前端页面的时候遇到一个问题(后端php猴子前端不怎么写) 我写了一段代码: <form action="">        <label for=&quo ...