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

求助:调整SHAP瀑布图数据标签小数位数时触发ValueError的解决方法

求助:调整SHAP瀑布图数据标签小数位数时触发ValueError的解决方法

我最近在处理SHAP瀑布图的时候也碰到了完全一样的问题——明明实际数据不是0,但绘图时标签被自动四舍五入显示成0,想调整小数位数却触发了ValueError,折腾了好一阵才找到问题根源!

问题分析

你遇到的ValueError,本质是因为ax.texts里包含了图中所有的文本元素,不只是数值标签。比如图里的“Base value”说明文字、特征名称旁边的标注等都是字符串,直接用float(text.get_text())转换自然会报错。之前的代码没有区分数值文本和非数值文本,才导致了转换失败。

解决方法

给遍历文本的逻辑加上try-except判断,只处理能转换成数值的文本,非数值文本直接跳过即可:

修改后的核心代码片段:

for text in ax.texts:
    text.set_color('k')
    # 尝试转换为数值,失败则跳过非数值文本
    try:
        value = float(text.get_text())
        text.set_text(f"{value:.4f}")  # 这里设置你想要的小数位数,比如4位
    except ValueError:
        # 非数值类文本,保持原样不修改
        continue

完整修改后的代码

把上面的片段替换到你原来的代码中,完整代码如下:

plt.figure()
fig, ax = plt.subplots()
fig.tight_layout(pad=7.0)
shap.plots.waterfall(val[26], show=False)

# 修改后的文本处理逻辑
for text in ax.texts:
    text.set_color('k')
    try:
        value = float(text.get_text())
        text.set_text(f"{value:.4f}")
    except ValueError:
        continue

fig, ax = plt.gcf(), plt.gca()
ax.grid(axis='y', color='grey', linestyle=':', linewidth=1, alpha=0.5)
for tick in ax.get_xticklabels():
    tick.set_fontname('Times New Roman')
    tick.set_fontsize(14)
    tick.set_color('k')
for tick in ax.get_yticklabels():
    tick.set_fontname('Times New Roman')
    tick.set_fontsize(14)
    tick.set_color('k')
ax.spines["top"].set_visible(True)
ax.spines["top"].set_color('k')
ax.spines["left"].set_visible(True)
ax.spines["left"].set_color('k')
ax.spines["right"].set_visible(True)
ax.spines["right"].set_color('k')
plt.show()

补充说明

你之前尝试用decimal模块设置全局精度没用,是因为SHAP在生成瀑布图标签时,是直接将数值格式化为固定小数位数的字符串,不会受全局精度设置的影响,所以必须直接修改已经生成的文本标签内容才行。

备注:内容来源于stack exchange,提问作者PW14

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 14:09:31