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

如何用Plotly制作hexbin mapbox子图?能否用2D直方图替代?

问题:Plotly子图不支持hexbinmapbox的解决方案

问题背景

尝试用Plotly的make_subplots整合三个hexbin mapbox子图时,触发错误:ValueError: Unsupported subplot type: 'hexbinmapbox',同时询问是否可用2D直方图替代。

错误原因

Plotly的make_subplots目前不支持hexbinmapbox作为子图类型,因为hexbinmapbox依赖Mapbox底层渲染,子图系统暂未适配该类型。

解决方案

方案1:在同一Mapbox图中添加多组hexbin轨迹

如果不需要独立的Mapbox视图,可以在同一个地图上叠加多个hexbin层,通过图例区分不同类别:

import pandas as pd
import plotly.graph_objs as go

data = pd.DataFrame({
       'Cat': ['t','y','y','y','f','f','t','f','y','y','t','y','f','f'],
       'LAT': [5,6,4,5,4,7,8,9,5,6,18,17,15,16],
       'LON': [10,11,9,11,10,8,8,5,8,7,18,16,16,17],
       })

# 拆分数据集(修正原代码重复赋值的错误)
df_t = data[data['Cat'] == 't']
df_y = data[data['Cat'] == 'y']
df_f = data[data['Cat'] == 'f']

fig = go.Figure()

# 添加每个类别的hexbin轨迹
fig.add_trace(go.Histogram2dContour(
    lat=df_t['LAT'],
    lon=df_t['LON'],
    colorscale='Blues',
    name='t',
    showscale=False
))

fig.add_trace(go.Histogram2dContour(
    lat=df_y['LAT'],
    lon=df_y['LON'],
    colorscale='Greens',
    name='y',
    showscale=False
))

fig.add_trace(go.Histogram2dContour(
    lat=df_f['LAT'],
    lon=df_f['LON'],
    colorscale='Reds',
    name='f'
))

# 设置Mapbox基础配置
fig.update_layout(
    mapbox_style='carto-positron',
    mapbox_zoom=3,
    mapbox_center={'lat': 10, 'lon': 12},
    title='三类数据的Hexbin Mapbox叠加图'
)

fig.show()

方案2:用2D直方图(Histogram2d)实现子图布局

如果不需要地图背景,完全可以用2D直方图替代,这是make_subplots支持的子图类型:

import pandas as pd
import plotly.graph_objs as go
from plotly.subplots import make_subplots

data = pd.DataFrame({
       'Cat': ['t','y','y','y','f','f','t','f','y','y','t','y','f','f'],
       'LAT': [5,6,4,5,4,7,8,9,5,6,18,17,15,16],
       'LON': [10,11,9,11,10,8,8,5,8,7,18,16,16,17],
       })

# 拆分数据集
df_t = data[data['Cat'] == 't']
df_y = data[data['Cat'] == 'y']
df_f = data[data['Cat'] == 'f']

# 创建3行1列的子图,指定类型为xy(支持2D直方图)
fig = make_subplots(
    rows=3, 
    cols=1, 
    subplot_titles=('t', 'y', 'f'),
    vertical_spacing=0.1
)

# 逐个添加子图的2D直方图
fig.add_trace(go.Histogram2d(
    x=df_t['LON'],
    y=df_t['LAT'],
    colorscale='Blues',
    showscale=False
), row=1, col=1)

fig.add_trace(go.Histogram2d(
    x=df_y['LON'],
    y=df_y['LAT'],
    colorscale='Greens',
    showscale=False
), row=2, col=1)

fig.add_trace(go.Histogram2d(
    x=df_f['LON'],
    y=df_f['LAT'],
    colorscale='Reds'
), row=3, col=1)

# 优化布局样式
fig.update_layout(height=900, width=600, title_text="三类数据的2D直方图子图")
fig.update_xaxes(title_text="经度", row=1, col=1)
fig.update_xaxes(title_text="经度", row=2, col=1)
fig.update_xaxes(title_text="经度", row=3, col=1)
fig.update_yaxes(title_text="纬度", row=1, col=1)
fig.update_yaxes(title_text="纬度", row=2, col=1)
fig.update_yaxes(title_text="纬度", row=3, col=1)

fig.show()

额外注意点

  • 原代码存在数据集拆分错误:三次将结果赋值给df_t,导致只有最后一个类别的数据被保留,修正后需改为三个独立变量。
  • 若必须保留地图背景的子图,目前Plotly官方暂不支持该功能,只能通过Dash等框架实现多图拼接,无法在单个Figure中完成。

内容的提问来源于stack exchange,提问作者jonboy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 02:20:08