如何用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
相关产品推荐
相关产品推荐

