求助:调整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
相关产品推荐
相关产品推荐

