唐山 天气:(数据科学学习手札83)基于geopandas的空间数据剖析——geoplot篇(下)

admin 2个月前 (05-17) 科技 7 0

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

1 简介

  在上一篇文章中我们详细学习了geoplot中较为基础的三种绘图API:pointplot()polyplot()以及webmap(),而本文将会承接上文的内容,对geoplot中较为适用的几种高级绘图API举行先容。

图1

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

2 geoplot进阶

  上一篇文章中的pointplot()polyplot以及webmap()辅助我们解决了在绘制散点、基础面以及添加在线舆图底图的问题,为了制作出信息量更厚实的可视化作品,我们需要更强的操作矢量数据与映射值的能力,geoplot为我们封装好了几种常见的高级可视化API。

2.1 Choropleth

  Choropleth图又称作区域漫衍图面量图,我们在系列之前的深入浅出分层设色篇中先容过其原理及geopandas实现,可以通过将指标值映射到面数据上,以实现对指标值区域漫衍的可视化。

  在geoplot中我们可以通过choropleth()来快速绘制区域漫衍图,其主要参数如下:

df:传入对应的GeoDataFrame工具

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

hue:传入对应df中指定列名或外部序列数据,用于映射面的颜色,默以为None即不举行设色

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

alpha:控制全局色彩透明度

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

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

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

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

edgecolor:控制多边形轮廓颜色

linewidth:控制多边形轮廓线型

  下面我们通过现实的例子来学习geoplot.choropleth的用法,这里使用到的数据为美国新型冠状肺炎各州病例数漫衍,对应日期为2020年5月14日,来自Github堆栈:https://github.com/CSSEGISandData/COVID-19/tree/master/csse_covid_19_data/csse_covid_19_daily_reports_us;使用到的美国本土各州矢量面数据contiguous-usa.geojson已上传到文章开头对应的Github堆栈中:

图2 图3

  首先我们将两张表中各自对应的州名数据作为键举行毗邻(注重pd.merge返回的效果类型为DataFrame,需要转换回GeoDataFrame):

# 根据州名列举行毗邻
usa_plot_base = pd.merge(left=contiguous_usa,
                         right=usa_covid19_20200513,
                         left_on='state',
                         right_on='Province_State')

# 转换DataFrame到GeoDataFrame,注重要加上crs信息
usa_plot_base = gpd.GeoDataFrame(usa_plot_base, crs='EPSG:4326')

  接下来我们将确诊数作为映射值,由于美国各州中纽约州和新泽西州确诊数目划分达到了34万和14万,远远跨越其他州,以是这里作为单独的图层举行阴影填充以突出其严重水平:

# 图层1:除最严重两州之外的其他州
ax = gplt.choropleth(df=usa_plot_base.query("state not in ['New York', 'New Jersey']"),
                     projection=gcrs.AlbersEqualArea(),
                     hue='Confirmed',
                     scheme=mc.FisherJenks(usa_plot_base.query("state not in ['New York', 'New Jersey']")['Confirmed'], k=3),
                     cmap='Reds',
                     alpha=0.8,
                     edgecolor='lightgrey',
                     linewidth=0.2,
                     figsize=(8, 8)
                     )

# 图层2:纽约州
ax = gplt.polyplot(df=usa_plot_base.query("state == 'New York'"),
                   hatch='/////',
                   edgecolor='black',
                   ax=ax)

# 图层3:新泽西州
ax = gplt.polyplot(df=usa_plot_base.query("state == 'New Jersey'"),
                   hatch='/////',
                   edgecolor='red',
                   extent=usa_plot_base.total_bounds,
                   ax=ax)

# 实例化cmap方案
cmap = plt.get_cmap('Reds')

# 获得mapclassify中BoxPlot的数据分层点
bp = mc.FisherJenks(usa_plot_base.query("state not in ['New York', 'New Jersey']")['Confirmed'], k=3)
bins = [0] + bp.bins.tolist()

# 制作图例映射工具列表,这里分配Greys方案到三种色彩时对应的是[0, 0.5, 1]这三个采样点
LegendElement = [mpatches.Patch(facecolor=cmap(_ / 2), label=f'{int(bins[_])}-{int(bins[_+1])}') 
                 for _ in range(3)] + \
                [mpatches.Patch(facecolor='none', 
                                edgecolor='black', 
                                linewidth=0.2,
                                hatch='/////', 
                                label='New York: {}'.format(usa_plot_base.query("state == \"New York\"").Confirmed.to_list()[0])),
                 mpatches.Patch(facecolor='none', 
                                edgecolor='red', 
                                linewidth=0.2,
                                hatch='/////', 
                                label='New Jersey: {}'.format(usa_plot_base.query("state == \"New Jersey\"").Confirmed.to_list()[0]))]

# 将制作好的图例映射工具列表导入legend()中,并设置相关参数
ax.legend(handles = LegendElement, 
          loc='lower left', 
          fontsize=8, 
          title='确诊数目', 
          title_fontsize=10, 
          borderpad=0.6)

# 添加题目
plt.title('美国新冠肺炎各州病例数(停止2020.05.14)', fontsize=18)

# 保留图像
plt.savefig('图4.png', dpi=300, pad_inches=0, bbox_inches='tight')
唐山 天气:(数据科学学习手札83)基于geopandas的空间数据剖析——geoplot篇(下) 第1张 图4

  这样我们就获得了图4,需要注重的是,geoplot.choropleth()只能绘制区域漫衍图,传入面数据后hue参数必须指定对应映射列,否则会报错,因此这里我们叠加纽约州和新泽西州单独面图层时使用的是polyplot()

2.2 Kdeplot

  geoplot中的kdeplot()对应核密度图,其基于seaborn中的kdeplot(),通过对矢量点数据漫衍盘算核密度估量,从而对点数据举行可视化,可用来展示点数据的空间漫衍情形,其主要参数如下:

df:传入对应的存放点数据的GeoDataFrame工具

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

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

clipGeoSeries型,用于为初始天生的核密度图像举行蒙版裁切,下文会举例说明

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

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

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

shade:bool型,当设置为False时只有等值线被绘制出,当设置为True时会绘制核密度填充

shade_lowest:bool型,控制是否对概率密度最低的条理举行填充,下文会举例说明

n_levels:int型,控制等值线数目,即根据概率密度对空间举行平均划分的数目

  下面我们回到上一篇文章开头的例子——纽约车祸纪录数据,在其他参数均为默认的情形下,挪用kdeplot对车祸纪录点数据的空间漫衍举行可视化:

# 图层1:行政界限
ax = gplt.polyplot(df=nyc_boroughs,
                   projection=gcrs.AlbersEqualArea())

# 图层2:默认参数下的kdeplot
ax = gplt.kdeplot(df=nyc_collision_factors,
                  cmap='Reds',
                  ax=ax)

# 保留图像
plt.savefig('图5.png', dpi=300, pad_inches=0, bbox_inches='tight')
唐山 天气:(数据科学学习手札83)基于geopandas的空间数据剖析——geoplot篇(下) 第2张 图5

  可以看到,在kdeplot()主要参数均为默认值的情形下,我们获得了点数据空间漫衍的概率估量效果及其等高线,譬如图中对照显著能看到的两个点漫衍较为麋集的中央,下面我们调整n_levles参数到对照大的数字:

# 图层1:行政界限
ax = gplt.polyplot(df=nyc_boroughs,
                   projection=gcrs.AlbersEqualArea())

# 图层2:kdeplot
ax = gplt.kdeplot(df=nyc_collision_factors,
                  cmap='Reds',
                  n_levels=30,
                  ax=ax,
                  figsize=(8, 8))

# 保留图像
plt.savefig('图6.png', dpi=300, pad_inches=0, bbox_inches='tight')
唐山 天气:(数据科学学习手札83)基于geopandas的空间数据剖析——geoplot篇(下) 第3张 图6

  可以看到在增大n_levels参数后,图中等值线的数目随之增添,下面我们设置shade=True

# 图层1:行政界限
ax = gplt.polyplot(df=nyc_boroughs,
                   projection=gcrs.AlbersEqualArea())

# 图层2:kdeplot
ax = gplt.kdeplot(df=nyc_collision_factors,
                  cmap='Reds',
                  shade=True,
                  ax=ax,
                  figsize=(8, 8))

# 保留图像
plt.savefig('图7.png', dpi=300, pad_inches=0, bbox_inches='tight')
唐山 天气:(数据科学学习手札83)基于geopandas的空间数据剖析——geoplot篇(下) 第4张 图7

  这时图像等值线间获得响应颜色的填充,使得点漫衍中央看起来加倍显著,再添加参数shade_lowest=True,即可对空白区域举行填充:

唐山 天气:(数据科学学习手札83)基于geopandas的空间数据剖析——geoplot篇(下) 第5张 图8

  随之而来的问题是整幅图像都被填充,为了裁切出核密度图像的区域轮廓,将底层行政区面数据作为clip的参数传入,便获得理想的效果:

唐山 天气:(数据科学学习手札83)基于geopandas的空间数据剖析——geoplot篇(下) 第6张 图9

2.3 Sankey

  桑基图专门用于显示差别工具之间某个指标量的流动情形,譬如最常见的航线流向情形,其本质是对线数据举行可视化,并将指标值映射到线的色彩或粗细水平上,而geoplot中的sankey()可以用来绘制这种图,尴尬的是sankey()绘制出的OD流向图着实太丑,但sankey()中将数值映射到线数据色彩和粗细的特征可以用来举行与流量相关的可视化,其主要参数如下:

df:传入对应的GeoDataFrame工具

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

hue:传入对应df中指定列名或外部序列数据,用于映射线的颜色,默以为None即不举行设色

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

alpha:控制全局色彩透明度

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

scale:用于设定映射线要素粗细水平的序列数据,花样同hue,默以为None即每条线等粗

linewidth:当纰谬线宽举行映射时,该参数用于控制线宽

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

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

  下面我们以2015年华盛顿街道路网日平均交通流量数据为例,其中每个要素均为线要素,aadt代表日均流量:

唐山 天气:(数据科学学习手札83)基于geopandas的空间数据剖析——geoplot篇(下) 第7张 图10

  我们将其流量列映射到线的粗细水平和颜色上来,为了雅观起见我们选择系列文章分层设色篇palettableSunsetDark作为配色方案:

# 选择配色方案为SunsetDark_5
from palettable.cartocolors.sequential import SunsetDark_5

gplt.sankey(
    dc_roads, 
    projection=gcrs.AlbersEqualArea(),
    scale='aadt', 
    hue='aadt',
    limits=(0.1, 2), # 控制线宽局限
    scheme=mc.NaturalBreaks(dc_roads['aadt']),
    cmap=SunsetDark_5.mpl_colormap,
    figsize=(8, 8),
    extent=dc_roads.total_bounds
)

plt.savefig("图11.png", dpi=500, pad_inches=0, bbox_inches='tight')
唐山 天气:(数据科学学习手札83)基于geopandas的空间数据剖析——geoplot篇(下) 第8张 图11

2.4 geoplot中的坐标参考系

  geoplot中的坐标参考系与geopandas中治理起来的方式截然差别,由于geopandas基于pyproj治理坐标参考系,而geoplot中的crs子模块泉源于cartopy,这一点我跟geoplot的主要开发者聊过,他示意geoplot暂时不支持geopandas中那样自定义随便投影或使用EPSG投影,而是内置了一系列常用的投影,譬如我们上文中绘制美国区域时频仍使用到的AlbersEqualArea()即之前我们在geopandas中通过proj4自定义的阿尔伯斯等面积投影,其他常见投影譬如Web MercatorRobinson,或者直接绘制球体舆图,如本文开头的图1就来自官方示例(https://residentmario.github.io/geoplot/gallery/plot_los_angeles_flights.html#sphx-glr-gallery-plot-los-angeles-flights-py),关于geoplot坐标参考系的细节对照简单本文不多赘述,感兴趣的读者可以前往官网(https://residentmario.github.io/geoplot/api_reference.html#projections)查看。

2.5 在模拟中学习

  又到了最喜欢的“复刻”环节啦,本文要模拟的舆图可视化作品来自https://github.com/Z3tt/30DayMapChallenge/tree/master/contributions/Day26_Hydrology,同样是用R语言实现,对全球主要河流的形态举行优雅地可视化:

唐山 天气:(数据科学学习手札83)基于geopandas的空间数据剖析——geoplot篇(下) 第9张 图12

  针对其河流宽度方面的可视化,我们基于上文中的sankey()来实现,由于原图中南极洲区域现实上是强调了的,其R源码中设置的纬度局限达到了-110度,这是原作者为了放得下题目内容,以是在图像下部区域虚构了一篇区域,而geoplot中的extent参数严格要求经度必须在-180到180度之间,纬度在-90到90度之间。因此在原图的基础上我们举行微调,将题目移动到居中位置,详细代码如下:

from palettable.cartocolors.sequential import Teal_7_r
import matplotlib.font_manager as fm
from shapely.geometry import box

# 读入天下主要河流线数据
world_river = gpd.read_file('geometry/world_rivers_dSe.geojson')
# 读入天下海洋面数据
world_ocean = gpd.read_file('geometry/world_ocean.shp')

# 图层1:天下局限背景色,基于shapely.geometry中的bbox来天生矩形矢量
ax = gplt.polyplot(df=gpd.GeoDataFrame({'geometry': [box(-180, -90, 180, 90)]}),
                   facecolor='#000026',
                   edgecolor='#000026')

# 图层2:天下海洋面图层
ax = gplt.polyplot(world_ocean,
                   facecolor='#00003a',
                   edgecolor='#00003a',
                   ax=ax)

# 图层3:天下主要河流线图层
ax = gplt.sankey(world_river,
                 scale='StrokeWeig',
                 hue='StrokeWeig',
                 scheme=mc.Quantiles(world_river['StrokeWeig'], 7),
                 cmap=Teal_7_r.mpl_colormap,
                 limits=(0.05, 0.4),
                 figsize=(8, 8),
                 extent=(-180, -90, 180, 90),
                 ax=ax)

# 添加题目
ax.text(0, 0, 'The Rivers of the World', 
        fontproperties=fm.FontProperties(fname="AlexBrush-Regular.ttf"), # 传入Alex Brush手写字体文件
        fontsize=28, 
        color=Teal_7_r.mpl_colors[-1],
        horizontalalignment='center',
        verticalalignment='center')

# 添加作者信息及数据泉源
ax.text(0, -15, 'Visualization by CNFeffery  -  Data by Natural Earth', 
        fontproperties=fm.FontProperties(fname="AlexBrush-Regular.ttf"), 
        fontsize=8, 
        color='#599bae',
        horizontalalignment='center',
        verticalalignment='center')

plt.savefig('图13.png', dpi=600, pad_inches=0, bbox_inches='tight')
唐山 天气:(数据科学学习手札83)基于geopandas的空间数据剖析——geoplot篇(下) 第10张 图13

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

,

sunbet

www.ysycy.com与伊顺源清真餐饮达成战略合作,在伊顺及亚太地区建立直营平台。为Sunbet会员提供线上多种娱乐游戏,将用完善的技术、贴心的服务、雄厚的资金赢取每位Sunbet代理、会员的口碑。

皇冠体育声明:该文看法仅代表作者自己,与本平台无关。转载请注明:唐山 天气:(数据科学学习手札83)基于geopandas的空间数据剖析——geoplot篇(下)

网友评论

  • (*)

最新评论

文章归档

站点信息

  • 文章总数:517
  • 页面总数:0
  • 分类总数:8
  • 标签总数:849
  • 评论总数:161
  • 浏览总数:3309