You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Plotly中绘制两个hexbin mapbox的差值可视化图?

Plotly Hexbin Mapbox 差值图实现及报错解决

能否生成差值单图?

可以实现,但核心前提是让两个hexbin的分箱网格完全对齐,否则无法直接计算差值。

实现步骤

  1. 统一分箱规则:生成两个hexbin时,必须使用完全相同的参数:
    • 手动指定一致的lon_range和lat_range(取两个数据集经纬度的最大/最小值)
    • 固定nx_hexagon(或radius)参数,确保分箱数量一致
    • 保持min_count参数相同,避免空箱过滤导致形状差异
  2. 提取计数并计算差值:从两个hexbin对象中提取每个分箱的点计数,计算t - y的差值,再通过vmin=0或直接将负值置0来过滤负差值
  3. 绘制差值图:基于统一的分箱参数,替换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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 22:52:53