Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >在模仿中精进数据可视化06:常见抽象地图的制作

在模仿中精进数据可视化06:常见抽象地图的制作

作者头像
派大星的数据屋
发布于 2022-04-03 04:51:24
发布于 2022-04-03 04:51:24
64900
代码可运行
举报
运行总次数:0
代码可运行

❝本文完整代码及数据已上传至我的Github仓库https://github.com/CNFeffery/FefferyViz ❞

1 简介

我们经常会在一些「PPT报告」或者「宣传广告」中看到一些比较抽象的地图,它们都是在正常地图的基础上,通过置换几何元素,来实现出较为抽象的效果,这类的作品非常之多,因此本文不模仿实际的某幅作品,而是制作出下面三类抽象地图:

图1

2 基于Python模仿常见抽象地图

对应图1,我们下面来分别模仿3类抽象地图,首先准备一下要用到的中国地图数据,我们偷个懒直接使用高德开源的地图数据接口

图2

为了方便和简化之后的运算,我们利用unary_union来将融合所有要素为一个:

图3

这样我们的基础数据就准备好了~

2.1 向外环形扩散的地图

首先我们来制作图1左图所示,从以某个点为圆心,向外环形扩散的地图,原理其实很简单,只需要定义圆心坐标,接着向外按照等差数列,依次扩大半径距离计算缓冲区的轮廓线:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from shapely.geometry import Point
import matplotlib.pyplot as plt

fig, ax = plt.subplots(figsize=(8, 8))

# 以重庆为圆心,生成向外的环形线,间隔为80公里
center = gpd.GeoSeries([Point((106.546737, 29.566598))], crs='EPSG:4326').to_crs(albers_proj)
circles = gpd.GeoSeries([center[0].buffer(i*1000*80).boundary for i in range(1, 45)], crs=albers_proj)

ax = china_total.plot(ax=ax, facecolor='none', edgecolor='black')
ax = circles.plot(ax=ax)

图4

可以看到目前生成的环形线已经可以覆盖中国全境,最后用china_total来裁剪即可:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
fig, ax = plt.subplots(figsize=(8, 8))

# 用china_total作为蒙版从circles中裁切出绘图所需部分
ax = gpd.clip(circles, mask=china_total).plot(ax=ax, color='white')

ax.set_facecolor('#4a4db7')

fig.set_facecolor('#4a4db7')

ax.set_xticks([])
ax.set_yticks([])

ax.spines['left'].set_color('none')
ax.spines['top'].set_color('none')
ax.spines['right'].set_color('none')
ax.spines['bottom'].set_color('none')

fig.savefig('图5.png', dpi=500, bbox_inches='tight', pad_inches=0)

图5

在这幅图的基础上,你就可以添加其他的文字标注等元素,形成配图,使得你的报告更加高级。

2.2 像素风格地图

接着我们来制作图1中图所示的由方块组成的像素风格地图,原理也很简单,生成覆盖china_total范围的网格:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from shapely.geometry import MultiLineString
from shapely.ops import polygonize # 用于将交叉线转换为网格面
import numpy as np

# 提取china_total左下角与右上角坐标
xmin, ymin, xmax, ymax = china_total.total_bounds
xmin, ymin, xmax, ymax = int(xmin), int(ymin), int(xmax), int(ymax)

# 创建x方向上的所有坐标位置,间距50公里
x = np.arange(xmin, xmax, 50*1000)

# 创建y方向上的所有坐标位置,间距50公里
y = np.arange(ymin, ymax, 50*1000)

# 生成全部交叉线坐标信息
hlines = [((x1, yi), (x2, yi)) for x1, x2 in zip(x[:-1], x[1:]) for yi in y]
vlines = [((xi, y1), (xi, y2)) for y1, y2 in zip(y[:-1], y[1:]) for xi in x]

grids = gpd.GeoSeries(list(polygonize(MultiLineString(hlines + vlines))), crs=albers_proj)
grids.plot(facecolor='none', edgecolor='black')

图6

再向内缓冲一定的距离,即可得到结果:

图7

2.3 由不规则多边形拼凑的地图

最后我们来制作图1右图所示的由不规则多边形拼凑的地图,需要用到「泰森多边形」,我们可以通过pip install geovoronoi来安装辅助库。

因为泰森多边形需要从点出发创建多边形,因此我们可以生成目标面内部的随机散点,再作为输入来生成所需的多边形:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from geovoronoi import voronoi_regions_from_coords


np.random.seed(42)
coords = gpd.GeoSeries([Point(x, y) for x, y in zip(np.random.uniform(xmin, xmax, 1000), 
                                                    np.random.uniform(ymin, ymax, 1000))],
                       crs=albers_proj)

# 得到china_total内部的散点坐标数组
coords = coords[coords.within(china_total[0])]

# 利用geovoronoi得到所需的泰森多边形,其中poly_shapes即为我们需要的多边形
poly_shapes, pts, poly_to_pt_assignments = voronoi_regions_from_coords(np.array(coords.apply(lambda g: (g.x, g.y)).tolist()), 
                                                                       china_total[0])

fig, ax = plt.subplots(figsize=(8, 8))

ax = china_total.plot(ax=ax, facecolor='none', 
                      edgecolor='white', linewidth=0.5)

(
    gpd
    .GeoSeries(poly_shapes)
    .buffer(-10*1000)
    .plot(ax=ax, 
          facecolor='white',
          linewidth=0.2)
)

ax.set_xticks([])
ax.set_yticks([])

ax.set_facecolor('#4a4db7')
fig.set_facecolor('#4a4db7')

ax.spines['left'].set_color('none')
ax.spines['top'].set_color('none')
ax.spines['right'].set_color('none')
ax.spines['bottom'].set_color('none')

fig.savefig('图8.png', dpi=500, bbox_inches='tight', pad_inches=0)

图8

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-01-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python大数据分析 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
(在模仿中精进数据可视化04)旧金山街道树木分布可视化
  开门见山,今天我们要模仿的数据可视化作品来自#TidyTuesday活动于2020年1月28日发布的旧金山街道树木数据集下的众多参赛作品中,由Philippe Massicotte创作的(如图1所示)非常受欢迎的Street trees of San Francisco:
Feffery
2020/11/24
6360
(在模仿中精进数据可视化04)旧金山街道树木分布可视化
(在模仿中精进数据可视化03)OD数据的特殊可视化方式
OD数据是交通、城市规划以及GIS等领域常见的一类数据,特点是每一条数据都记录了一次OD(O即Origin,D即Destination)行为的起点与终点坐标信息。
Feffery
2020/10/27
2.6K0
(在模仿中精进数据可视化03)OD数据的特殊可视化方式
(数据科学学习手札78)基于geopandas的空间数据分析——基础可视化
  通过前面的文章,我们已经对geopandas中的数据结构、坐标参考系以及文件IO有了较为深入的学习,在拿到一份矢量数据开始分析时,对其进行可视化无疑是探索了解数据阶段重要的步骤。
Feffery
2020/03/04
3.7K0
(数据科学学习手札78)基于geopandas的空间数据分析——基础可视化
Python3快速入门(十六)——Mat
Matplotlib是 Python 2D-绘图领域使用最广泛的套件,可以简易地将数据图形化,并且提供多样化的输出格式。 matplotlib有两个接口,一个是状态机层的接口,通过pyplot模块来进行管理;一个是面向对象的接口,通过pylab模块将所有的功能函数全部导入其单独的命名空间内。
py3study
2020/01/03
1.4K0
Python-plotnine 核密度空间插值可视化绘制
从本期开始,我会陆续推出系列空间插值的推文教程,包括常见的「Kriging(克里金插值法)、Nearest Neighbor(最近邻点插值法)、Polynomial Regression(多元回归法)、Radial Basis Function(径向基函数法)」 等多种空间插值方法,探索空间可视化带给我们的视觉魅力。
DataCharm
2021/02/22
5.6K1
Python-plotnine 核密度空间插值可视化绘制
(数据科学学习手札74)基于geopandas的空间数据分析——数据结构篇
geopandas是建立在GEOS、GDAL、PROJ等开源地理空间计算相关框架之上的,类似pandas语法风格的空间数据分析Python库,其目标是尽可能地简化Python中的地理空间数据处理,减少对Arcgis、PostGIS等工具的依赖,使得处理地理空间数据变得更加高效简洁,打造纯Python式的空间数据处理工作流。本系列文章就将围绕geopandas及其使用过程中涉及到的其他包进行系统性的介绍说明,每一篇将尽可能全面具体地介绍geopandas对应方面的知识,计划涵盖geopandas的数据结构、投影坐标系管理、文件IO、基础地图制作、集合操作、空间连接与聚合。   作为基于geopandas的空间数据分析系列文章的第一篇,通过本文你将会学习到geopandas中的数据结构。 geopandas的安装和使用需要若干依赖包,如果不事先妥善安装好这些依赖包而直接使用pip install geopandas或conda install geopandas可能会引发依赖包相关错误导致安装失败,官方文档中的推荐安装方式为:
Feffery
2020/02/15
2.9K0
(数据科学学习手札84)基于geopandas的空间数据分析——空间计算篇(上)
  在本系列之前的文章中我们主要讨论了geopandas及其相关库在数据可视化方面的应用,各个案例涉及的数据预处理过程也仅仅涉及到基础的矢量数据处理。在实际的空间数据分析过程中,数据可视化只是对最终分析结果的发布与展示,在此之前,根据实际任务的不同,需要衔接很多较为进阶的空间操作,本文就将对geopandas中的部分空间计算进行介绍。
Feffery
2020/05/25
4.1K0
(数据科学学习手札84)基于geopandas的空间数据分析——空间计算篇(上)
超简单,百行Python代码制作动态条形图跳舞
打码不易,不想被白嫖,有需要完整代码和GDP数据集的同学,可以对本文点赞,在看,和分享后在公众号“算法美食屋”后台回复关键字:动态图,添加作者微信获取。感谢支持。? 先上图片: 再上视频: 最后上代
lyhue1991
2021/06/15
6170
Matplotlib可视化Pyplot Tutorial
MATLAB, and pyplot, have the concept of the current figure and the current axes. All plotting commands apply to the current axes. The function gca() returns the current axes (a matplotlib.axes.Axes instance), and gcf() returns the current figure (matplotlib.figure.Figure instance).
用户2183996
2018/06/28
6640
(在模仿中精进数据可视化05)疫情期间市值增长top25公司
  新冠疫情对很多实体经济带来冲击的同时,也给很多公司带来了新的增长点。前段时间我看到图1所示的数据可视化作品,针对2020年1月1日到6月16日之间,世界范围内市值增大最多的25家公司进行可视化:
Feffery
2020/12/01
3430
(在模仿中精进数据可视化05)疫情期间市值增长top25公司
(在模仿中精进数据可视化01) 全国38城居住自由指数可视化
前不久贝壳研究院基于其丰富的房地产相关数据资源,发布了2020 新一线城市居住报告:
Feffery
2020/09/06
8500
善用图片-你将有不一样的可视化效果
今天在查找资料时发现了一个超酷的R语言第三方颜色包 R-ghibli,目前可以直接通过 CRAN 安装的。官网(https://ewenme.github.io/ghibli/)所示的图例如下:
DataCharm
2021/02/22
4440
善用图片-你将有不一样的可视化效果
数据可视化 | 手撕 Matplotlib 绘图原理(二)
关于箭头和注释风格的更多介绍与示例,可以在 Matplotlib 的画廊gallery[1]中看到,尤其推荐
数据STUDIO
2021/06/24
1.5K1
Matplotlib 可视化进阶之PCA主成分分布图
计算沿正交方向到主成分分析分布的宽度。主轴是通过旋转点并在Y轴上取max来实现的。
数据STUDIO
2022/05/24
1.1K0
Matplotlib 可视化进阶之PCA主成分分布图
数据可视化之matplotlib绘制正余弦曲线图
在python里面,数据可视化是python的一个亮点。在python里面,数据可视可以达到什么样的效果,这当然与我们使用的库有关。python常常需要导入库,并不断调用方法,就很像一条流数据可视化的库,有很多,很多都可以后续开发,然后我们调用。了解过pyecharts美观的可视化界面 ,将pyecharts和matplotlib相对比一下。
兰舟千帆
2022/07/16
1.8K0
数据可视化之matplotlib绘制正余弦曲线图
常见地图白化方法(二)
地图白化是一种绘制地图的技术,它可以实现对感兴趣区域以外的数据进行遮盖或填充白色的效果,从而突出显示目标区域的特征。 地图白化的原理是利用 shapefile 文件中的多边形坐标来创建一个剪切路径,然后将这个路径应用到 matplotlib 的绘图对象上,使得只有路径内的数据可见,路径外的数据被隐藏或覆盖。 气象家园的另一个五星上将clarmy在龙场悟道后开发了cnmaps库,解决广大地学学子绘制地图的痛点
用户11172986
2024/06/20
1750
常见地图白化方法(二)
geopandas:Python绘制数据地图
GeoPandas是一个Python开源项目,旨在提供丰富而简单的地理空间数据处理接口。 GeoPandas扩展了Pandas的数据类型,并使用matplotlib进行绘图。GeoPandas官方仓库地址为:GeoPandas。 GeoPandas的官方文档地址为:GeoPandas-doc。 本文主要参考GeoPandas Examples Gallery。 GeoPandas的基础使用见Python绘制数据地图1-GeoPandas入门指北。 GeoPandas的可视化入门见Python绘制数据地图2-GeoPandas地图可视化。
luckpunk
2023/09/14
4K0
geopandas:Python绘制数据地图
(数据科学学习手札77)基于geopandas的空间数据分析——文件IO
  在上一篇文章中我们对geopandas中的坐标参考系有了较为深入的学习,而在日常空间数据分析工作中矢量文件的读入和写出,是至关重要的环节。
Feffery
2020/02/26
2.2K0
利用Python绘制全国各省新型冠状病毒疫情变化动态图
题图:Image by enriquelopezgarre from Pixabay
猴哥yuri
2020/02/25
2.6K0
TOP50 Python可视化经典案例上(附源码,建议收藏)
很多读者想学Python转数据分析,在学习或使用的过程中经常会忘记一些图表的具体用法,所以行哥分享matplotlib和seaborn速查表给读者们在画图的时候使用,需要pdf版本的话可以在行哥免费的星球里下载
行哥玩Python
2020/07/14
2.8K0
TOP50 Python可视化经典案例上(附源码,建议收藏)
推荐阅读
相关推荐
(在模仿中精进数据可视化04)旧金山街道树木分布可视化
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验