(数据科学学习手札83)基于geopandas的空间数据分析——geoplot篇(下) (4)

  geoplot中的坐标参考系与geopandas中管理起来的方式截然不同,因为geopandas基于pyproj管理坐标参考系,而geoplot中的crs子模块来源于cartopy,这一点我跟geoplot的主要开发者聊过,他表示geoplot暂时不支持geopandas中那样自定义任意投影或使用EPSG投影,而是内置了一系列常用的投影,譬如我们上文中绘制美国区域时频繁使用到的AlbersEqualArea()即之前我们在geopandas中通过proj4自定义的阿尔伯斯等面积投影,其他常见投影譬如Web Mercator、Robinson,或者直接绘制球体地图,如本文开头的图1就来自官方示例(geoplot坐标参考系的细节比较简单本文不多赘述,感兴趣的读者可以前往官网(

2.5 在模仿中学习

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

图12

图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')

图13

图13

  以上就是本文的全部内容,我将在下一篇文章中继续与大家一起探讨学习geoplot中更高级的绘图API。如有疑问和意见,欢迎留言或在我的Github仓库中发起issues与我交流。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zzxygp.html