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

遍历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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 23:36:36