如何在SHAP力图中保留4位小数且不旋转文本?
解决SHAP力图变量小数位数过多且不旋转文本的问题
方法1:预处理数据,手动保留指定小数位数
直接对特征值和SHAP值做小数位数截断,再传入绘图函数:
import shap import matplotlib.pyplot as plt # 假设已获取shap_values、特征数据集X及特征名feature_names sample_idx = 0 # 保留3位小数处理特征值与SHAP值 rounded_features = [round(val, 3) for val in X.iloc[sample_idx].values] rounded_shap_vals = [round(val, 3) for val in shap_values[sample_idx]] # 生成处理后的force plot shap.plots.force( base_value=shap_values.base_values[sample_idx], shap_values=rounded_shap_vals, features=rounded_features, feature_names=feature_names, matplotlib=True, figsize=(40, 3) ) plt.show()
方法2:绘图后修改文本标签
如果不想改动原始数据,可在生成图表后遍历文本元素,替换为指定小数位数的内容:
import shap import matplotlib.pyplot as plt import re # 生成原始force plot fig = shap.plots.force( shap_values[0], matplotlib=True, figsize=(40, 3) ) # 遍历所有文本,替换数值为3位小数 for text in fig.axes[0].texts: raw_text = text.get_text() # 正则匹配数值并格式化 formatted_text = re.sub(r'(-?\d+\.\d+)', lambda m: f"{float(m.group(1)):.3f}", raw_text) text.set_text(formatted_text) plt.show()
额外优化(避免文本拥挤)
如果不旋转文本仍有显示问题,可尝试:
- 进一步增大
figsize的宽度(比如(50, 3)),给文本留出更多空间 - 减小文本字体大小:在绘图后添加
plt.gca().tick_params(labelsize=8),或遍历文本设置text.set_fontsize(8)
内容的提问来源于stack exchange,提问作者hridhi
相关产品推荐
相关产品推荐

