datashader使用ds.by(color, ds.any())聚合时的异常行为问询
原因说明
异常背景产生原因
ds.by(分类字段, ds.any()) 会对每个分类生成布尔类型的聚合栅格,每个像素仅返回「存在该分类数据点」/「不存在该分类数据点」两个状态。默认配置下datashader不会将无数据点的像素自动设为透明,而是按照色阶映射规则给无点区域分配基础色值,最终多个分类的背景色叠加就会生成非固定的橄榄色异常背景。
未添加ds.any()的默认配置使用ds.count()聚合器,无点像素的计数值为0,会被datashader自动处理为透明,因此不会出现异常背景。
dynspread失效原因
dynspread的核心逻辑是根据像素的计数值动态调整扩散范围,默认阈值是针对计数值大于1的计数聚合场景设计的。ds.any()的输出仅包含0和1两个值,默认阈值判断无法识别需要扩散的有效像素,导致扩散逻辑无法触发。
解决方案
1. 消除异常背景
在datashade调用时显式指定nodata参数为全透明RGBA值,强制无数据点区域透明:
datashaded2 = datashade(points, aggregator=ds.by(color, ds.any()), nodata=(0,0,0,0)).opts(width=550, height=480)
2. 修复dynspread失效问题
调整dynspread的threshold参数为小于1的数值,适配ds.any()的布尔值输出:
dynspread(datashaded2, threshold=0.5) * color_points
按照上述配置修改后,即可获得和原生渲染接近的稀疏点显示效果,同时保留datashader应对大数据量的渲染能力。
内容的提问来源于stack exchange,提问作者Noskario
相关产品推荐
相关产品推荐

