如何在Plotly中绘制两个hexbin mapbox的差值可视化图?
Plotly Hexbin Mapbox 差值图实现及报错解决
能否生成差值单图?
可以实现,但核心前提是让两个hexbin的分箱网格完全对齐,否则无法直接计算差值。
实现步骤
- 统一分箱规则:生成两个hexbin时,必须使用完全相同的参数:
- 手动指定一致的
lon_range和lat_range(取两个数据集经纬度的最大/最小值) - 固定
nx_hexagon(或radius)参数,确保分箱数量一致 - 保持
min_count参数相同,避免空箱过滤导致形状差异
- 手动指定一致的
- 提取计数并计算差值:从两个hexbin对象中提取每个分箱的点计数,计算
t - y的差值,再通过vmin=0或直接将负值置0来过滤负差值 - 绘制差值图:基于统一的分箱参数,替换hexbin的颜色值为差值即可
报错ValueError: operands could not be broadcast together with shapes (3,) (4,)解决
这个错误是因为两个hexbin的分箱结果数组形状不匹配,根源是分箱参数或数据范围不一致导致分箱数量不同。
解决方法:
- 强制指定两个hexbin的
lon_range、lat_range为相同范围,确保分箱覆盖区域一致 - 固定
nx_hexagon(或radius)参数,避免因数据分布不同导致自动分箱数量差异 - 确保
min_count参数一致,防止其中一个hexbin过滤了空箱而另一个没有,造成数组长度不同
示例代码
import plotly.express as px import numpy as np # 取两个数据集的经纬度极值,统一分箱范围 lon_bounds = [min(df_t['lon'].min(), df_y['lon'].min()), max(df_t['lon'].max(), df_y['lon'].max())] lat_bounds = [min(df_t['lat'].min(), df_y['lat'].min()), max(df_t['lat'].max(), df_y['lat'].max())] hex_count = 3 # 固定分箱数量 # 生成t的hexbin,使用统一参数 fig_t = px.hexbin_mapbox(df_t, lat='lat', lon='lon', nx_hexagon=hex_count, lon_range=lon_bounds, lat_range=lat_bounds, min_count=1) count_t = fig_t.data[0].z # 生成y的hexbin,参数完全一致 fig_y = px.hexbin_mapbox(df_y, lat='lat', lon='lon', nx_hexagon=hex_count, lon_range=lon_bounds, lat_range=lat_bounds, min_count=1) count_y = fig_y.data[0].z # 计算差值并过滤负值 diff_counts = np.maximum(count_t - count_y, 0) # 构建差值图 fig_diff = px.hexbin_mapbox(df_t, lat='lat', lon='lon', nx_hexagon=hex_count, lon_range=lon_bounds, lat_range=lat_bounds, min_count=1) fig_diff.data[0].z = diff_counts fig_diff.update_layout( coloraxis_colorbar_title='t-y差值', mapbox_style='carto-positron' ) fig_diff.show()
内容的提问来源于stack exchange,提问作者jonboy
相关产品推荐
相关产品推荐

