博客
关于我
(数据科学学习手札79)基于geopandas的空间数据分析——深入浅出分层设色
阅读量:431 次
发布时间:2019-03-06

本文共 2639 字,大约阅读时间需要 8 分钟。

1 简介

通过前面的文章,我们已经对 geopandas 中的数据结构、坐标参考系、文件 IO 以及基础可视化有了较为深入的学习,其中在基础可视化那篇文章中我们提到了分层设色地图,可以对与多边形关联的数值属性进行分层,并分别映射不同的填充颜色,但只是开了个头举了个简单的例子,实际数据可视化过程中的分层设色有一套策略方法。

作为基于 geopandas 的空间数据分析系列文章的第五篇,通过本文你将会学习到基于 geopandas 和机器学习的分层设色。


2 基于 geopandas 的分层设色

地区分布图(Choropleth maps,又叫面量图)作为可能是最常见的一种地理可视化方法,其核心是对某个与矢量面关联的数值序列进行有意义的分层,并为这些分层选择合适美观的色彩,最后完成对地图的着色,优点是美观且直观,即使对地理信息一窍不通的人,也能通过颜色区分出不同面之间的同质性与异质性。

但同样地,如果对数据分层采取的方法有失严谨没有很好的遵循数据特点,会很容易让看到图的人产生出不正确的判断。下面我们按照先分层,后设色的顺序进行介绍。


2.1 基于 mapclassify 的数据分层

上一篇文章中我们提到过,在 geopandas.GeoDataFrame.plot() 中,参数 scheme 对应的数据分层是基于第三方库 mapclassify 实现的,因此要想对 geopandas 中的数据分层有深入的了解,我们就得先来了解一下 mapclassify 中的各种数据分层算法。


2.2 色彩方案的选择

前面已经详细介绍了数据分层常用的各种方法及使用场景,“分层”的部分做完之后,就到了设色的部分,其实色彩搭配是比较主观的事情,但想要自己创造出美观合理的配色方案并不是容易的事情。

下面我们来介绍两种选择配色方案的方法。


2.2.1 基于 palettable 的配色

下面我要给大家介绍的 Python 第三方库 palettable 在我之前关于词云图的一篇文章中介绍 stylecloud 时介绍过,是专门帮助我们为可视化作品配色的。

palettable 不依赖其他三方库,纯 Python 实现,其强大之处在于内置了数量惊人的经典配色方案,囊括了 CartoColors、cmocean、Colorbrewer2、Cubehelix、Light & Bartlein、matplotlib、MyCarta、Scientific、Tableau 以及 The Wes Anderson Palettes blog 中的大量经典配色方案。


2.2.2 基于图片主色的配色

我们在生活中偶然会看到配色方案让人眼前一亮的海报或画作,这时如果你想将这些作品中的主要颜色也应用到自己的可视化作品上,可以参考我下面的做法。


3.1 箱线图法

BoxPlot 即箱线图,是统计学中使用到的一种方法:对个数为 n 观测数据从小到大进行排序,分别得到位置处于 0.25n、0.5n 以及 0.75n 的观测值,称为 Q1、中位数和 Q3(即第一四位数、中位数和第三四分位数),并定义 Q3-Q1 为 IQR,以 Q1-1.5IQR 为下限,以 Q3+1.5IQR 为上限,将小于下限或大于上限的观测值作为离群异常值,最后用图像的形式表达上述计算结果。

在 mapclassify 中我们使用 BoxPlot 来为数据实现箱线图分层:

import mapclassify as mc# 对各省2020-03-08对应的累计确诊数量进行分层bp = mc.BoxPlot(temp['province_confirmedCount'])# 查看数据分层结果bp

3.2 等间距法

EqualInterval 即等间距,是最简单的一种分层方法,它在原数据最小值与最大值间以等间距的方式划分出 k 个层次,mapclassify 中对应等间距法的类为 EqualInterval()。

bp = mc.EqualInterval(temp['province_confirmedCount'])# 查看数据分层结果bp

3.3 自然断点法

在了解 mapclassify 中的 FisherJenks 之前,我们先来了解一下什么是 Jenks Natural Breaks。


3.4 k-medians 算法

mapclassify 中的 JenksCaspall 本质上为 k-medians 聚类,其首先根据分层层数 k 在数据中找到 k-1 个分位数点,将原始数据等分为数量尽可能相同的 k 份并以这 k 份数据的中位数作为各自的初始点,接着基于 k-medians 的思想,迭代计算为每个样本点找到与其距离更近的中位数点,并以此重新划分分层以及重新计算各分层中位数点,直至每个数据对应的分层标签不再变化,再将每个分层中数据的最大值作为间断点。


3.5 头尾断点法

HeadTailBreaks 是一种较为崭新的数据分层方法,专门用于对具有重尾特点的数据进行分层。


3.6 分位数法

Quantiles 即分位数,原理很简单,根据分位数点对原数据进行等分。


3.7 百分位数法

Percentiles 同样是使用分位数对数据进行分层,Percentiles 提供了参数 pct 以允许用户以百分位数的形式传入自定义分隔点。


3.8 标准差法

StdMean 的思想类似于前面的箱线图,不同的是箱线图属于非参数方法,而 StdMean 建立在正态分布为基础的经验法则之上。


3.9 自定义分层

关于数据分层最后要介绍的是自定义分层,即按照用户输入的分隔点来自由划分数据集。


4 色彩方案选择

色彩搭配是比较主观的事情,但想要自己创造出美观合理的配色方案并不容易。下面我们来介绍两种选择配色方案的方法。


4.1 基于 palettable 的配色

palettable 是一个专门用于为可视化作品配色的 Python 第三方库,其内置了数量惊人的经典配色方案,包括 CartoColors、cmocean、Colorbrewer2 等。


4.2 基于图片主色的配色

我们可以参考平面作品的主色来为可视化作品配色。以下是具体步骤:

  • 从图片中提取像素点,构建特征矩阵。
  • 使用 k-means 算法对特征进行聚类。
  • 提取聚类簇重心作为主色。

  • 以上就是本文的全部内容,如有笔误望指出。

    转载地址:http://ctcuz.baihongyu.com/

    你可能感兴趣的文章
    NMF(非负矩阵分解)
    查看>>
    nmon_x86_64_centos7工具如何使用
    查看>>
    NN&DL4.1 Deep L-layer neural network简介
    查看>>
    NN&DL4.3 Getting your matrix dimensions right
    查看>>
    NN&DL4.7 Parameters vs Hyperparameters
    查看>>
    NN&DL4.8 What does this have to do with the brain?
    查看>>
    nnU-Net 终极指南
    查看>>
    No 'Access-Control-Allow-Origin' header is present on the requested resource.
    查看>>
    NO 157 去掉禅道访问地址中的zentao
    查看>>
    no available service ‘default‘ found, please make sure registry config corre seata
    查看>>
    No compiler is provided in this environment. Perhaps you are running on a JRE rather than a JDK?
    查看>>
    no connection could be made because the target machine actively refused it.问题解决
    查看>>
    No Datastore Session bound to thread, and configuration does not allow creation of non-transactional
    查看>>
    No fallbackFactory instance of type class com.ruoyi---SpringCloud Alibaba_若依微服务框架改造---工作笔记005
    查看>>
    No Feign Client for loadBalancing defined. Did you forget to include spring-cloud-starter-loadbalanc
    查看>>
    No mapping found for HTTP request with URI [/...] in DispatcherServlet with name ...的解决方法
    查看>>
    No mapping found for HTTP request with URI [/logout.do] in DispatcherServlet with name 'springmvc'
    查看>>
    No module named 'crispy_forms'等使用pycharm开发
    查看>>
    No module named cv2
    查看>>
    No module named tensorboard.main在安装tensorboardX的时候遇到的问题
    查看>>