在Python中,choropleth贴图如何与着色光栅相结合?
我想在地图上描绘一些地区的特征,但由于人口密度非常不均匀,较大的瓷砖会误导人们的注意力。想一想邮政编码的平均值(比如考试分数) 高分辨率地图可用于不同的居住地区,甚至其中的密度。下面的Python代码根据每个像素的平均密度生成一个彩色光栅 然而,我真正需要的是从同一地区的choropleth地图(本例中为匈牙利的邮政编码)着色,但着色只影响光栅上显示的点。光栅只能确定像素的伽马(或者在某些3D模拟中可能是高度)。做这件事的好方法是什么 一个光栅.蒙版.蒙版不知怎的 (顺便说一句,带邮政编码边界的覆盖也不错,但我更了解如何使用在Python中,choropleth贴图如何与着色光栅相结合?,python,rasterio,datashader,geoviews,Python,Rasterio,Datashader,Geoviews,我想在地图上描绘一些地区的特征,但由于人口密度非常不均匀,较大的瓷砖会误导人们的注意力。想一想邮政编码的平均值(比如考试分数) 高分辨率地图可用于不同的居住地区,甚至其中的密度。下面的Python代码根据每个像素的平均密度生成一个彩色光栅 然而,我真正需要的是从同一地区的choropleth地图(本例中为匈牙利的邮政编码)着色,但着色只影响光栅上显示的点。光栅只能确定像素的伽马(或者在某些3D模拟中可能是高度)。做这件事的好方法是什么 一个光栅.蒙版.蒙版不知怎的 (顺便说一句,带邮政编码边界的
GeoViews
)
Datashader将允许您将多种类型的数据组合到一个通用的光栅形状中,在该形状中,您可以使用基于NumPy的xarray操作进行任意制作或过滤。例如,您可以将choropleth渲染为多边形,然后遮罩无人居住的区域。如何按面积进行规范化取决于您,可能会变得非常复杂,但一旦您准确定义了您打算做什么,就应该是可行的。有关如何执行此操作的示例,请参见处的
转换
代码,如中所示:
def transform(overlay):
picks = overlay.get(0).redim(pickup_x='x', pickup_y='y')
drops = overlay.get(1).redim(dropoff_x='x', dropoff_y='y')
pick_agg = picks.data.Count.data
drop_agg = drops.data.Count.data
more_picks = picks.clone(picks.data.where(pick_agg>drop_agg))
more_drops = drops.clone(drops.data.where(drop_agg>pick_agg))
return (hd.shade(more_drops, cmap=['lightcyan', "blue"]) *
hd.shade(more_picks, cmap=['mistyrose', "red"]))
picks = hv.Points(df, ['pickup_x', 'pickup_y'])
drops = hv.Points(df, ['dropoff_x', 'dropoff_y'])
((hd.rasterize(picks) * hd.rasterize(drops))).apply(transform).opts(
bgcolor='white', xaxis=None, yaxis=None, width=900, height=500)
在这里,它并不是真的掩蔽任何东西,但希望你能看到掩蔽是如何工作的;只需获取一些光栅化对象,然后使用其他光栅化对象进行数学运算。在这里,所有步骤都是在使用HoloViews对象的函数中完成的,这样您就可以有一个实时交互绘图,但是您可能希望使用datashader.org上更基本的代码来解决这个问题,在这里,您只需要处理xarray对象,而不需要HoloViews管道;然后,您可以将为单个xarray所做的工作转换为HoloViews管道,该管道将允许使用平移、缩放、轴等进行完全交互
def transform(overlay):
picks = overlay.get(0).redim(pickup_x='x', pickup_y='y')
drops = overlay.get(1).redim(dropoff_x='x', dropoff_y='y')
pick_agg = picks.data.Count.data
drop_agg = drops.data.Count.data
more_picks = picks.clone(picks.data.where(pick_agg>drop_agg))
more_drops = drops.clone(drops.data.where(drop_agg>pick_agg))
return (hd.shade(more_drops, cmap=['lightcyan', "blue"]) *
hd.shade(more_picks, cmap=['mistyrose', "red"]))
picks = hv.Points(df, ['pickup_x', 'pickup_y'])
drops = hv.Points(df, ['dropoff_x', 'dropoff_y'])
((hd.rasterize(picks) * hd.rasterize(drops))).apply(transform).opts(
bgcolor='white', xaxis=None, yaxis=None, width=900, height=500)