如何绘制充满 nan 值的列?

问题描述 投票:0回答:1

我的代码运行一个 geojson 文件,并一一绘制该文件中的列,以向用户显示优化的成本。它运行得很好,直到遇到一列只有 nan 值的情况。

我对此做了一些研究,发现 Geopandas (v0.14.4) 绘图文件首先创建一个值为 nan 的列表:

nan_idx = np.asarray(pd.isna(values), dtype="bool")

然后重置

values
变量以包含所有非 nan 的值:

values = cat.codes[~nan_idx]

然后用占位符填充 nan,以便可以正确绘制它们:

for n in np.where(nan_idx)[0]:
    values = np.insert(values, n, values[0])

这就是问题所在!由于该列只包含 nan,我从

values[0]
收到一个 IndexError,因为它现在是空的。通过将一个值更改为浮点数再次确认了这一点,并且它工作得很好;将 nan 绘制为缺失值。

谁能告诉我是否有另一种方法来绘制包含所有 nan 值的列,或者这个问题是否已在较新版本的 GeoPandas 中得到解决?重要的是要表明这些值都是“缺失值”,因为这只会表明该特定列不可行。

代码片段是(其中

name
是列名称,
hexagons
指的是Geopandas df):

fig = plt.figure(figsize=figsize)
    ax = plt.axes(projection=crs)
    ax.set_axis_off()

    hexagons.to_crs(crs.proj4_init).plot(
        ax=ax,
        column = name,
        legend = legend,
        cmap = cmap,
        legend_kwds = legend_kwds,
        missing_kwds = missing_kwds,
    )

    ax.set_title(name)
    fig.savefig(output_folder + f"/{name}.png", bbox_inches=bbox_inches)
    plt.close()
python geopandas
1个回答
0
投票

要处理仅包含 NaN 值的列,您可以在绘图步骤之前添加检查,以确保该列不为空或填充 NaN 值。如果是,您可以跳过该列的绘图或提供占位符值。这是代码的更新版本,应该会有所帮助:

蟒蛇 科皮亚扎科杜尔 将 geopandas 导入为 gpd 将 numpy 导入为 np 将 matplotlib.pyplot 导入为 plt 将 pandas 导入为 pd

defplot_with_nan_check(六边形,名称,figsize=(10, 10),crs=无,图例=False,cmap='viridis', legend_kwds=无,missing_kwds=无,output_folder='./',bbox_inches='紧'):

# Check if the column contains only NaN values
if hexagons[name].isna().all():
    print(f"Column '{name}' contains only NaN values.")
    # Handle this case, e.g., by assigning a placeholder value or skipping the plot
    values = np.zeros(len(hexagons))  # You can adjust this placeholder value as needed
else:
    values = hexagons[name]

fig = plt.figure(figsize=figsize)
ax = plt.axes(projection=crs)
ax.set_axis_off()

hexagons.to_crs(crs.proj4_init).plot(
    ax=ax,
    column=name,
    legend=legend,
    cmap=cmap,
    legend_kwds=legend_kwds,
    missing_kwds=missing_kwds,
)

ax.set_title(name)
fig.savefig(output_folder + f"/{name}.png", bbox_inches=bbox_inches)
plt.close()
© www.soinside.com 2019 - 2024. All rights reserved.