遍历shapefile单元绘制FisherJenks分级统计图仅输出前2个问题
问题根因
你设置FisherJenks分类的分类数k=5,该算法要求单个绘图子集内LSTR字段的非空有效样本量至少大于等于分类数才能正常计算断点。前两个按字母排序的地理单元满足样本量要求,从第三个地理单元开始,要么对应子集的要素总数不足5个、要么LSTR字段空值过多导致有效样本量不满足计算要求,代码没有做异常捕获,触发静默中断直接终止循环,因此不会输出后续地图。另外循环绘图时未显式关闭画布,matplotlib内存堆积也可能导致后续渲染失败。
修复代码
import matplotlib.pyplot as plt # 遍历所有地理单元 use = data.pln_area.unique() for pln_area in use: # 筛选当前单元数据,剔除LSTR空值 cgdf = data[data.pln_area == pln_area].copy() cgdf = cgdf[cgdf['LSTR'].notna()] # 有效样本量不足2个直接跳过 if len(cgdf) < 2: print(f"地理单元{pln_area}有效样本量不足,跳过绘制") continue # 动态适配分类数:样本量≥5时用k=5,否则k等于当前样本量 k_val = min(5, len(cgdf)) try: f, ax = plt.subplots(1, figsize=(12, 8)) cgdf.plot( column="LSTR", k=k_val, scheme="FisherJenks", ax=ax, edgecolor='grey', legend=True, cmap="Blues", alpha=0.6 ) plt.title(f'{pln_area}') ax.set_axis_off() plt.show() plt.close() # 显式关闭画布释放内存 except Exception as e: print(f"绘制地理单元{pln_area}失败,错误信息:{str(e)}") plt.close() continue
排查提示
如果需要定位具体是哪个地理单元最先触发问题,可以先运行以下代码统计每个单元的有效样本量:
# 统计每个pln_area下LSTR字段的非空值数量 sample_count = data.groupby('pln_area')['LSTR'].count() print(sample_count)
运行后就能看到哪些单元的有效样本量小于5,对应就是导致循环中断的单元。
内容的提问来源于stack exchange,提问作者Mahyar
相关产品推荐
相关产品推荐

