Jupyter Notebook中Bokeh地图无法显示问题求助
解决Bokeh绘制超大数据量地图无输出问题
核心原因
2,303,566条记录直接渲染单个圆形标记,会导致浏览器内存溢出或渲染超时——这是Jupyter无输出且无报错的主要原因,前端无法处理如此庞大的图形元素,而非后端代码逻辑错误(空白地图正常显示已验证基础配置正确)。
分步解决方案
1. 验证小样本数据,确认代码逻辑
先取小样本测试,排除代码本身问题:
# 随机采样1万条数据 df_sample = df.sample(n=10000, random_state=42) source = ColumnDataSource(data=df_sample) # 后续绘图代码不变,替换source为df_sample的数据源
如果样本能正常显示,说明问题完全来自数据量过大。
2. 用聚合图形替代单个点渲染
针对百万级数据,Bokeh提供了适合的聚合型图形,推荐两种方案:
方案A:六边形瓦片聚合(HexTiles)
将地图划分为六边形网格,每个网格展示数据聚合值(如平均火灾大小):
from bokeh.models import HexTile # 调整六边形大小(根据数据范围修改size参数) p.hex_tile(q="mercator_x", r="mercator_y", size=5000, fill_color=linear_cmap(field_name='FIRE_SIZE', palette=palette, low=df['FIRE_SIZE'].min(), high=df['FIRE_SIZE'].max()), fill_alpha=0.7, source=source)
方案B:热力图(基于二维直方图)
计算经纬度网格的密度,用色块展示分布:
# 计算二维直方图 x_bins = np.linspace(df['mercator_x'].min(), df['mercator_x'].max(), 200) y_bins = np.linspace(df['mercator_y'].min(), df['mercator_y'].max(), 200) hist, x_edges, y_edges = np.histogram2d(df['mercator_x'], df['mercator_y'], bins=[x_bins, y_bins]) # 转换为Bokeh数据源 heat_source = ColumnDataSource(data=dict( x=x_edges[:-1], y=y_edges[:-1], counts=hist.flatten() )) color_mapper = LinearColorMapper(palette=RdYlGn[11], low=0, high=hist.max()) p.image(image='counts', x='x', y='y', dw=x_bins[1]-x_bins[0], dh=y_bins[1]-y_bins[0], color_mapper=color_mapper, source=heat_source)
3. 优化数据源传输
不要将整个DataFrame传给ColumnDataSource,只保留绘图必需的列,减少前端加载数据量:
# 仅选择绘图所需列 df_filtered = df[['mercator_x', 'mercator_y', 'FIRE_SIZE', 'FIRE_YEAR', 'STATE']] source = ColumnDataSource(data=df_filtered)
4. 检查墨卡托坐标异常值
确认转换后的坐标没有超出地图可视范围:
print(df['mercator_x'].describe()) print(df['mercator_y'].describe())
如果存在极端值(如NaN或超出±2e7范围),过滤异常经纬度数据(示例为美国区域范围,可按需调整):
df = df[(df['LATITUDE'].between(20, 50)) & (df['LONGITUDE'].between(-130, -60))]
5. 查看浏览器控制台错误
Jupyter可能隐藏前端报错,打开浏览器开发者工具(F12)→ Console面板,查看是否有内存不足或渲染超时的错误,直接确认问题根源。
内容的提问来源于stack exchange,提问作者Brad
相关产品推荐
相关产品推荐

