可以看到在增大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') 图7这时图像等值线间得到相应颜色的填充,使得点分布中心看起来更加明显,再添加参数shade_lowest=True,即可对空白区域进行填充:
图8随之而来的问题是整幅图像都被填充,为了裁切出核密度图像的地区轮廓,将底层行政区面数据作为clip的参数传入,便得到理想的效果:
图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)
ax:matplotlib坐标轴对象,如果需要在同一个坐标轴内叠加多个图层就需要用这个参数传入先前待叠加的ax
下面我们以2015年华盛顿街道路网日平均交通流量数据为例,其中每个要素均为线要素,aadt代表日均流量:
图10我们将其流量列映射到线的粗细程度和颜色上来,为了美观起见我们选择系列文章分层设色篇中palettable的SunsetDark作为配色方案:
# 选择配色方案为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') 图11 2.4 geoplot中的坐标参考系