大庆二手房:(数据科学学习手札82)基于geopandas的空间数据剖析——geoplot篇(上)

admin 5天前 科技 68 2

本文示例代码和数据已上传至我的Github堆栈https://github.com/CNFeffery/DataScienceStudyNotes

1 简介

  在前面的基于geopandas的空间数据剖析系列文章中,我们已经对geopandas的基础知识、基础可视化,以及若何科学绘制分层设色舆图展开了深入的学习,而行使geopandas+matplotlib举行地理可视化虽然能实现常见的舆图可视化,且提供了操作图像的极高自由度,但对使用者matplotlib的熟悉水平要求较高,制作一幅舆图可视化作品往往需要编写较多的代码,而geoplot基于geopandas,提供了众多高度封装的绘图API,很大水平上简化了绘图难度,就像seaborn之于matplotlib

图1

  本文是基于geopandas的空间数据剖析系列文章的第6篇,通过本文你将学习geoplot中的基础绘图API。

2 geoplot基础

  推荐使用conda install --channel conda-forge geoplot来安装geoplot,可以制止许多恼人的依赖包问题。首先我们从一个简朴的例子来初探一下geoplot的基础使用流程:

2.1 从一个简朴的例子出发

  我们下面所使用到的数据:nyc-boroughs.geojson,记录了纽约的行政区域面文件:

import geopandas as gpd

%matplotlib inline

# 读入纽约行政区域面文件
nyc_boroughs = gpd.read_file('geometry/nyc-boroughs.geojson')
nyc_boroughs.head()
图2

  以及nyc-collision-factors.geojson,包含了纽约所发生的车祸记录点以及相关信息数据:

# 读入纽约车祸记录点文件
nyc_collision_factors = gpd.read_file('geometry/nyc-collision-factors.geojson')
nyc_collision_factors.head()
图3

  首先我们使用geoplot中的polyplot来绘制纽约行政区划,这里使用geoplot自带的Albers等面积投影作为投影:

import geoplot as gplt
import geoplot.crs as gcrs
import matplotlib.pyplot as plt

ax = gplt.polyplot(df=nyc_boroughs,
                   projection=gcrs.AlbersEqualArea())

plt.savefig("图4.png", bbox_inches='tight', pad_inches=0, dpi=300)
大庆二手房:(数据科学学习手札82)基于geopandas的空间数据剖析——geoplot篇(上) 第1张 图4

  接着我们使用geoplot中的pointplot将点叠加到图4上:

ax = gplt.polyplot(df=nyc_boroughs,
                   projection=gcrs.AlbersEqualArea())

ax = gplt.pointplot(df=nyc_collision_factors,
                    s=2,
                    color='grey',
                    alpha=0.2,
                    linewidth=0, # 设置轮廓粗细为0
                    ax=ax)

plt.savefig("图5.png", bbox_inches='tight', pad_inches=0, dpi=300)
大庆二手房:(数据科学学习手札82)基于geopandas的空间数据剖析——geoplot篇(上) 第2张 图5

  为了让车祸麋集的区域更突出,我们将点图层换成核密度图层:

ax = gplt.polyplot(df=nyc_boroughs,
                   projection=gcrs.AlbersEqualArea())

# 叠加核密度图层
ax = gplt.kdeplot(df=nyc_collision_factors,
                  cmap='Reds',
                  shade=True,
                  shade_lowest=True,
                  clip=nyc_boroughs,
                  ax=ax)

plt.savefig("图6.png", bbox_inches='tight', pad_inches=0, dpi=300)
大庆二手房:(数据科学学习手札82)基于geopandas的空间数据剖析——geoplot篇(上) 第3张 图6

  从这个简朴的例子中我们可以大致领会到,geoplotgeopandas处理好的数据基础上,针对差别类型图层封装了各自差别的API,由用户自主传入对应类型的矢量数据举行图层叠加,以获得最终效果,且可以兼容matplotlib,譬如上面我们最终使用plt.savaefig()对图片举行保留,下面我们就来详细学习geoplot的基础知识。

2.2 geoplot绘图API

  在geoplot中内置了功效厚实的绘图API,只需要传入GeoDataFrame花样的矢量数据即可举行绘图(但切记geoplot中传入的数据必须为WGS84地理坐标系,所有的投影转换在geoplot各绘图函数内部传参实现即可!

2.2.1 Pointplot

  geoplot中的pointplot即为散点图,其针对点数据举行可视化,其主要参数如下:

df:传入对应的GeoDataFrame工具

projection:用于指定投影坐标系,传入geoplot.crs中的工具

hue:当需要凭据df中的某列或外部的其他序列数据来映射散点的色彩时,可传入对应df中指定列名或外部序列数据,默以为None即不举行设色

cmap:和matplotlib中的cmap使用方式一致,用于控制色彩映射方案

scheme:作用类似geopandas中的scheme参数,用于控制分层设色,详见本系列文章的分层设色篇,但差别的是在geoplot0.4.0版本之后此参数不再搭配分层数目k配合使用,而是更新为传入mapclassify分段效果工具,下文中会做详细演示

scale:用于设定映射散点巨细的序列数据,花样同hue,默以为None即每个散点等巨细

limits:元组型,当scale不为None时,用于设定散点巨细尺寸局限,花样为(min, max)

s:当scale设置为None时,用于控制散点的尺寸巨细

color:当hue设置为None时,用于控制散点的填充色彩

marker:用于设定散点的形状

alpha:控制全局色彩透明度

linewidths:控制散点轮廓宽度

edgecolors:控制散点轮廓颜色

legend:bool型,用于控制是否显示图例

legend_var:传入'hue'scale,当设定为hue时图例显示色彩映射信息,当设定为'scale'时图例显示巨细映射信息

legend_values:list型,用于自定义图例显示的各个详细数值

legend_labels:list型,用于自定义图例显示的各个详细数值对应的文字标签,与legend_values搭配使用

legend_kwargs:字典,在legend参数设置为True时来传入更多微调图例属性的参数

extent:元组型,用于传入左下角和右上角经纬度信息来设置舆图空间局限,花样为(min_longitude, min_latitude, max_longitude, max_latitude)

figsize:元组型,用于控制画幅巨细,花样为(x, y)

axmatplotlib坐标轴工具,若是需要在统一个坐标轴内叠加多个图层就需要用这个参数传入先前待叠加的ax

  知晓了上述主要参数之后,下面我们通过现实案例来学习修改各个参数获得的效果,使用到的数据为波士顿区划面数据以及波士顿部门地区Airbnb房源点数据:

大庆二手房:(数据科学学习手札82)基于geopandas的空间数据剖析——geoplot篇(上) 第4张 图7
  • 通俗散点漫衍

    首先我们来简朴绘制房源漫衍散点图,对巨细、色彩、透明度等基础属性举行简朴调整:

# 简朴绘制波士顿行政区划
ax = gplt.polyplot(df=boston_zip_codes,
                   projection=gcrs.AlbersEqualArea(),
                   edgecolor='lightgrey',
                   linewidths=0.5)

gplt.pointplot(df=boston_airbnb_listings,
               ax=ax, # 叠加图层
               s=1,
               linewidths=0.1,
               color='grey',
               alpha=0.4)

plt.savefig("图8.png", bbox_inches='tight', pad_inches=0, dpi=300)
大庆二手房:(数据科学学习手札82)基于geopandas的空间数据剖析——geoplot篇(上) 第5张 图8

  通过这样一张简朴的图我们是看不出太多信息的,只能大致看出哪些地方房源漫衍较多。

  • 映射房源价钱到色彩上

  将房源价钱列作为色彩映射列,使用mapclassify中的分位数法将价钱区间等分成五段,并使用其他的视觉参数和自定义图例参数:

import mapclassify as mc

#解决中文显示问题
plt.rcParams['font.sans-serif'] = ['SimHei'] # 指定默认字体
plt.rcParams['axes.unicode_minus'] = False # 解决保留图像是负号'-'显示为方块的问题

# 简朴绘制波士顿行政区划
ax = gplt.polyplot(df=boston_zip_codes,
                   projection=gcrs.AlbersEqualArea(),
                   edgecolor='lightgrey',
                   linewidths=0.5)

scheme = mc.Quantiles(boston_airbnb_listings['price'], k=5)
gplt.pointplot(df=boston_airbnb_listings,
               ax=ax, # 叠加图层
               s=1, # 散点巨细
               linewidths=0.1, # 散点轮廓宽度
               hue='price', # 以price作为色彩映射列
               cmap='Reds', # 色彩方案为Reds
               scheme=scheme, # 传入mapclassify工具
               legend=True, # 开启图例
               legend_kwargs={
                   'loc': 'lower right', # 图例位置
                   'title': '价钱区间', # 图例题目
                   'title_fontsize': 8, # 图例题目字体巨细
                   'fontsize': 6, # 图例非题目外字体巨细
                   'shadow': True, # 添加图例阴影
               },
               legend_labels=['80%-100%价钱房源',
                              '60%-80%价钱房源',
                              '40%-60%价钱房源',
                              '20%-40%价钱房源',
                              '前20%价钱房源'])

plt.savefig("图9.png", bbox_inches='tight', pad_inches=0, dpi=300)
大庆二手房:(数据科学学习手札82)基于geopandas的空间数据剖析——geoplot篇(上) 第6张 图9
  • 映射房源价钱到尺寸上

  看完了若何映射颜色,下面我们来看看若何将值映射到散点巨细上,使用scale='price'来将房源价钱映射到散点巨细上,再配合一些相关参数举行绘图:

import numpy as np

# 简朴绘制波士顿行政区划
ax = gplt.polyplot(df=boston_zip_codes,
                   projection=gcrs.AlbersEqualArea(),
                   edgecolor='lightgrey',
                   linewidths=0.5)

ax = gplt.pointplot(df=boston_airbnb_listings,
                    ax=ax, # 叠加图层
                    linewidths=0.2, # 散点轮廓宽度
                    scale='price', # 以price作为色彩映射列
                    color=np.array([0., 0., 0., 0.]), # 设置填充色为透明
                    edgecolor='grey', # 设置轮廓颜色
                    limits=(1, 16), # 设置散点的尺寸局限
                    legend=True, # 开启图例
                    legend_kwargs={
                        'loc': 'lower right', # 图例位置
                        'title': '价钱区间', # 图例题目
                        'title_fontsize': 8, # 图例题目字体巨细
                        'fontsize': 6, # 图例非题目外字体巨细
                        'shadow': True, # 添加图例阴影
                        'markeredgecolor': 'grey', # 图例符号的轮廓色彩
                        'markeredgewidth': 0.2 # 图例符号的轮廓粗细
                    })

plt.savefig("图10.png", bbox_inches='tight', pad_inches=0, dpi=300)
大庆二手房:(数据科学学习手札82)基于geopandas的空间数据剖析——geoplot篇(上) 第7张 图10

  现在我们可以一眼看出那些半径较大的圆圈对应着价钱较高的房源,值得注重的是在我们映射值到散点巨细上时,默认条件下会自动在图例中根据等间距法分出5段,这样获得的图例各个圆圈巨细过渡保证了平均,固然你也可以自由地通过legend_valueslegeng_labels这两个参数自定义图例内容。

  • 同时映射颜色与尺寸

  geoplot允许用户同时映射色彩和尺寸,但统一张图中的图例只能显示色彩或尺寸其中之一的信息,使用legend_var参数来选择让哪一种映射信息显示在图例上:

# 简朴绘制波士顿行政区划
ax = gplt.polyplot(df=boston_zip_codes,
                   projection=gcrs.AlbersEqualArea(),
                   edgecolor='lightgrey',
                   linewidths=0.5)

scheme = mc.Quantiles(boston_airbnb_listings['price'], k=5)
gplt.pointplot(df=boston_airbnb_listings,
               ax=ax, # 叠加图层
               scale='price', # 以price作为尺寸映射列
               limits=(1, 16), # 设置散点的尺寸局限
               alpha=0.6, # 设置散点透明度
               linewidths=0.1, # 散点轮廓宽度
               hue='price', # 以price作为色彩映射列
               cmap='Reds', # 色彩方案为Reds
               scheme=scheme, # 传入mapclassify工具
               legend=True, # 开启图例
               legend_kwargs={
                   'loc': 'lower right', # 图例位置
                   'title': '价钱区间', # 图例题目
                   'title_fontsize': 8, # 图例题目字体巨细
                   'fontsize': 6, # 图例非题目外字体巨细
                   'shadow': True, # 添加图例阴影
               },
               legend_labels=['80%-100%价钱房源',
                              '60%-80%价钱房源',
                              '40%-60%价钱房源',
                              '20%-40%价钱房源',
                              '前20%价钱房源'])

plt.savefig("图11.png", bbox_inches='tight', pad_inches=0, dpi=300)
大庆二手房:(数据科学学习手札82)基于geopandas的空间数据剖析——geoplot篇(上) 第8张 图11

2.2.2 Polyplot

  geoplot中的polyplot用于绘制基础的面数据,并不像pointplot那样带有值映射功效,其主要参数如下:

df:传入对应的GeoDataFrame工具

projection:用于指定投影坐标系,传入geoplot.crs中的工具

extent:元组型,用于传入左下角和右上角经纬度信息来设置舆图空间局限,花样为(min_longitude, min_latitude, max_longitude, max_latitude)

figsize:元组型,用于控制画幅巨细,花样为(x, y)

axmatplotlib坐标轴工具,若是需要在统一个坐标轴内叠加多个图层就需要用这个参数传入先前待叠加的ax

alpha:控制全局色彩透明度

linewidths:控制线宽度

edgecolors:控制线颜色

facecolor:控制填充颜色

linestyle:控制线样式,详情见本系列文章前作基础可视化篇图5

hatch:控制填充阴影纹路,详情见本系列文章前作基础可视化篇图7

  下面我们就对纽约区划面数据举行举例说明:

gplt.polyplot(df=nyc_boroughs,
              projection=gcrs.AlbersEqualArea(),
              figsize=(10, 10),
              linewidths=0.5,
              linestyle='-.',
              edgecolors='grey',
              facecolor='#d9c09e',
              hatch='--')

plt.savefig("图12.png", bbox_inches='tight', pad_inches=0, dpi=300)
大庆二手房:(数据科学学习手札82)基于geopandas的空间数据剖析——geoplot篇(上) 第9张 图12

2.2.3 Webmap

  geoplot中的webmap用来添加在线瓦片舆图底图,使得我们可以在在线舆图上图层,但现在暂时只支持叠加基于点要素的图层。值得注重的是,由于常见在线舆图如谷歌舆图、OpenStreetMap、高德舆图等的投影均为EPSG:3857也就是我们常说的Web Mercator,以是一旦要使用webmap,则投影锁死为EPSG:3857,其主要参数如下:

df:传入对应的GeoDataFrame工具

extent:元组型,用于传入左下角和右上角经纬度信息来设置舆图空间局限,花样为(min_longitude, min_latitude, max_longitude, max_latitude)

figsize:元组型,用于控制画幅巨细,花样为(x, y)

axmatplotlib坐标轴工具,若是需要在统一个坐标轴内叠加多个图层就需要用这个参数传入先前待叠加的ax

zoom:int型,控制在线舆图底图的缩放级别,越大越清晰,同时获取瓦片舆图资源从而渲染舆图所花费的时间也越多,上限由详细所使用的在线舆图所决议,通常情形最大缩放级别为18

provider:str型,用于指定在线舆图底图的类型,下面会举例说明

  下面我们将纽约车祸点数据叠加到在线舆图上,这里我们选择provider参数为ST_TERRAIN_LINES,并设置缩放级别为11级:

ax = gplt.webmap(df=nyc_boroughs,
                 provider='ST_TERRAIN_LINES',
                 zoom=10)

ax = gplt.pointplot(df=nyc_collision_factors,
                    color='lightyellow',
                    edgecolor='yellow',
                    alpha=0.4,
                    s=1,
                    ax=ax)

plt.savefig("图13.png", bbox_inches='tight', pad_inches=0, dpi=300)
大庆二手房:(数据科学学习手札82)基于geopandas的空间数据剖析——geoplot篇(上) 第10张 图13

  若是想要切换底图样式,可以修改provider参数的输入,现在为止所有可用的舆图如下图所示:

大庆二手房:(数据科学学习手札82)基于geopandas的空间数据剖析——geoplot篇(上) 第11张 图14

2.3 在模拟中学习

  在本系列文章基础可视化篇的最后我们对数据可视化专家用R绘制的澳大利亚火灾影响舆图举行了模拟,从而加深对geopandas数据可视化的融会贯通,而本文作为geoplot篇的上半篇,先容了geoplot中最基本的几种数据可视化API,使得我们足以完成较为基础的数据可视化作品,而同样为了加深对上文所先容知识的明白掌握,接下来我们再次对其他优异的数据可视化作品举行模拟。

  这次我们要模拟的作品来自Github堆栈https://github.com/Z3tt/30DayMapChallenge,是行使R举行地理空间数据可视化的一个集锦堆栈,要用geoplot来模拟复现的作品如图15所示,展示了柏林所有电动汽车充电桩的漫衍情形:

大庆二手房:(数据科学学习手札82)基于geopandas的空间数据剖析——geoplot篇(上) 第12张 图15

  我们主要浮现的是图15中柏林舆图以及内部元素部门,使用到的数据在我的Github堆栈对应本文路径下的Berlin文件夹中,其中ladesaeulen_bnetza_und_be_emobil.xlsx记录了EPSG:25833投影坐标系花样下的充电桩经纬度点信息,gis_osm_roads_free_1.shp记录了柏林市OSM路网信息,Bezirke__Berlin.shp记录了柏林行政区划信息。

  在剖析了原图的R代码之后,我们将整幅图拆解分为四个图层,1是柏林最边缘的灰色轮廓,这其实是整个柏林区域面数据向外天生缓冲区之后的效果;2是柏林各行政区区划,3是柏林内部的部门OSM路网,构成了图中依稀可见的类似纹路的要素,4是所有的充电桩点数据,即图中黄色的半透明散点,其中除路网线数据可视化以外的其他图层我们均使用geoplot来实现。

  数据预处理部门分步骤代码较多,不便在文章中通盘放出,你可以到文章开头的Github堆栈中对应路径下查看和下载,下面只贴出绘图部门的代码以利便明白头脑:

# 绘制最底层柏林缓冲区
ax = gplt.polyplot(df=gpd.GeoSeries([GeometryCollection(berlin_area.geometry.tolist())], crs='EPSG:4326') \
                         .buffer(0.005, resolution=100),
                   projection=gcrs.WebMercator(),
                   facecolor='grey',
                   edgecolor='None',
                   alpha=0.6)

# 绘制柏林区划
ax = gplt.polyplot(df=berlin_area,
                   facecolor='black',
                   edgecolor='white',
                   alpha=0.65,
                   ax=ax)

# 行使geopandas绘制内部OSM路网
ax = intersect_roads.plot(ax=ax, 
                          linewidth=0.1,
                          edgecolor='black',
                          alpha=0.25)

# 绘制充电桩散点
ax = gplt.pointplot(df=df_emobil,
                    ax=ax,
                    extent=berlin_area.total_bounds,
                    color='#edc00d',
                    alpha=0.3,
                    linewidth=0.2,
                    s=4.5)

# 绘制充电桩中心点
ax = gplt.pointplot(df=df_emobil,
                    ax=ax,
                    extent=berlin_area.buffer(0.01).total_bounds,
                    color='#d29c14',
                    edgecolor='#6f603e',
                    linewidth=0.01,
                    s=0.7)

plt.savefig("图16.png", bbox_inches='tight', pad_inches=0, dpi=600)

  最终获得的效果如图16所示:

大庆二手房:(数据科学学习手札82)基于geopandas的空间数据剖析——geoplot篇(上) 第13张 图16

  

  以上就是本文的全部内容,我将在下一篇文章中继续与人人一起探讨学习geoplot中更高级的绘图API。若有疑问和意见,迎接留言或在我的Github堆栈中提议issues与我交流。

,

阳光在线

阳光在线www.hengxianggo.com(原诚信在线)现已开放阳光在线手机版下载。阳光在线游戏公平、公开、公正,用实力赢取信誉。

欧博开户声明:该文看法仅代表作者自己,与本平台无关。转载请注明:大庆二手房:(数据科学学习手札82)基于geopandas的空间数据剖析——geoplot篇(上)

网友评论

  • (*)

最新评论

  • hg0088管理网 2020-05-16 00:54:19 回复

    Sunbet 申博:www.tggzfm.com展望2019年,将用完善的服务体系,创新的技术应用,雄厚的资金实力,贴心的服务品质,成为每位申博会员、代理的首选平台。网站挺不错的

    1

站点信息

  • 文章总数:474
  • 页面总数:0
  • 分类总数:8
  • 标签总数:850
  • 评论总数:143
  • 浏览总数:3464