如何在shapviz的SHAP依赖图中让y=0水平线置于数据点后方
解决SHAP依赖图中y=0水平线置于数据点后方的问题
要让水平线显示在SHAP数据点的后方,核心是调整ggplot的图层顺序——先绘制水平线,再绘制数据点。因为ggplot默认后添加的图层会覆盖在之前的图层上方,而sv_dependence返回的图已经包含了数据点图层,所以需要手动调整图层顺序,或者重新组织图层的添加逻辑。
方案一:直接调整现有ggplot对象的图层顺序
这是最简便的方法,无需修改太多代码,只需将水平线图层插入到所有图层的最前面:
# Load required libraries library(fastshap) library(shapviz) library(randomForest) library(ggplot2) # 显式加载ggplot2,方便操作图层 # Load example data data(iris) # Run a ML model model <- randomForest::randomForest(Sepal.Width ~ ., data = iris) # Calculate SHAP values shap_values <- fastshap::explain(model, X = iris[,!names(iris) %in% c("Sepal.Width")], pred_wrapper = predict, nsim = 5) # Dependence plot for "Petal.Length" shp <- shapviz(shap_values, X = iris[,!names(iris) %in% c("Sepal.Width")]) plot <- sv_dependence(shp, v = "Petal.Length", color_var = "Petal.Length") # 创建水平线图层 hline_layer <- geom_hline(yintercept = 0, color = "darkgrey") # 将水平线图层插入到plot的图层列表最前端(先绘制水平线,再绘制数据点) plot$layers <- c(hline_layer, plot$layers) # 显示最终图形 print(plot)
方案二:手动构建ggplot图层(更灵活)
如果你需要更精细地控制绘图元素,可以手动组合图层,先绘制水平线,再添加SHAP数据点和其他样式:
# (前面的加载数据、训练模型、计算SHAP值代码与上述一致) shp <- shapviz(shap_values, X = iris[,!names(iris) %in% c("Sepal.Width")]) # 手动构建图层:先水平线,再数据点,保持shapviz默认样式 plot <- ggplot(data = shp$S) + # 先绘制y=0水平线 geom_hline(yintercept = 0, color = "darkgrey") + # 添加SHAP数据点,映射x、y和颜色变量 geom_point(aes(x = Petal.Length, y = Petal.Length, color = Petal.Length), size = 2) + # 沿用shapviz默认的颜色比例尺和标签 scale_color_viridis_c(option = "inferno") + labs(x = "Petal.Length", y = "SHAP value (Petal.Length)", color = "Petal.Length") + theme_minimal() print(plot)
原理说明
ggplot的图层渲染顺序是从上到下(代码中先写的图层先绘制,后写的覆盖在上方)。sv_dependence生成的图默认先绘制数据点,所以直接用plot + geom_hline()会把线条放在点的上方;而通过调整图层顺序,让水平线先绘制,数据点后绘制,就能实现线条在点后方的效果。
内容的提问来源于stack exchange,提问作者kris
相关产品推荐
相关产品推荐

