GeoViews中Trimesh非结构化数据绘图:颜色映射与颜色条异常求助
解决GeoViews TriMesh颜色映射、颜色条及悬停显示问题
我来帮你搞定这个问题!你的核心痛点在于datashade的使用方式让GeoViews无法正确关联z值到颜色映射,同时悬停时只能拿到渲染后的RGBA值而非原始z数据。下面分两种场景给你解决方案:
场景1:数据量不大,直接用原生TriMesh渲染
如果你的三角网格顶点数不算特别多,直接用GeoViews原生的TriMesh就能满足需求,不需要借助datashade:
import geoviews as gv import pandas as pd import numpy as np # 你的数据准备代码保持不变 verts = pd.DataFrame(np.stack((x,y,z)).T, columns=['x', 'y' , 'z']) tri_sub = tri_new.apply(lambda x: x - 1) # 确保三角面索引从0开始 # 构建TriMesh,明确指定用z值作为颜色维度 trimesh = gv.TriMesh((tri_sub, gv.Points(verts, vdims=['z']))) # 叠加瓦片并配置样式 tiles = gv.WMTS('https://maps.wikimedia.org/osm-intl/{Z}/{X}/{Y}@2x.png') gg = tiles * trimesh.opts( cmap='jet', edge_color='z', # 边颜色也跟随z值变化 filled=True, height=400, width=400, tools=['hover'], colorbar=True, # 强制开启颜色条 colorbar_position='right' # 可选:设置颜色条位置 ) gv.save(gg, datetostr+"out432.html") print("End2")
场景2:数据量超大,必须用datashade优化渲染
如果数据量太大导致原生渲染卡顿,那得用DynamicMap包装datashade,同时把原始z数据关联到hover工具:
import geoviews as gv import pandas as pd import numpy as np import datashader as ds from datashader import transfer_functions as tf # 数据准备不变 verts = pd.DataFrame(np.stack((x,y,z)).T, columns=['x', 'y' , 'z']) tri_sub = tri_new.apply(lambda x: x - 1) # 创建TriMesh对象 trimesh = gv.TriMesh((tri_sub, gv.Points(verts, vdims=['z']))) # 定义datashade渲染函数,保留z值聚合信息 def render_trimesh(x_range, y_range): cvs = ds.Canvas(x_range=x_range, y_range=y_range) z_agg = cvs.trimesh(trimesh, agg=ds.mean('z')) return tf.shade(z_agg, cmap='jet') # 用DynamicMap实现交互式渲染 shaded_mesh = gv.DynamicMap(render_trimesh, streams=[gv.streams.RangeXY()]) # 叠加瓦片,配置hover关联原始数据 tiles = gv.WMTS('https://maps.wikimedia.org/osm-intl/{Z}/{X}/{Y}@2x.png') gg = tiles * shaded_mesh.opts( height=400, width=400, tools=['hover'], colorbar=True ).opts(hover_data=verts) # 让hover工具读取原始顶点的z值 gv.save(gg, datetostr+"out432.html") print("End2")
为什么之前的代码不行?
- 直接用
datashade()会把渲染结果转成RGB图像,GeoViews无法再关联原始z值,所以颜色条出不来,hover也只能看到RGBA值。 - 没有显式开启
colorbar=True,即使颜色映射生效,颜色条也不会自动显示。 - TriMesh的Points没有明确指定
vdims=['z'],GeoViews不知道该用哪个字段做颜色映射。
这样修改后,你要的效果就都有了:jet配色的colormap正常生效,颜色条显示z值范围,悬停时能看到对应的原始z数据。
内容的提问来源于stack exchange,提问作者MSA msa
相关产品推荐
相关产品推荐

