如何在张量平滑图中为X轴和Z轴添加密度图或地毯图
解决方案:在
vis.gam 3D透视图中添加密度/地毯图 要在vis.gam生成的3D透视图上添加数据密度可视化,核心是利用vis.gam返回的坐标转换函数,将2D轴的密度/地毯图坐标映射到3D绘图空间中。以下是具体实现步骤:
步骤1:绘制基础3D图并保存坐标转换函数
首先运行你的vis.gam代码,同时保存返回的坐标转换工具trans,后续用于将3D坐标转换为绘图设备的2D坐标:
# 拟合GAM模型 gam.model <- gam(death_or_neurodeficit1y ~ te(OtherBiomarker, laktat_0, bs = 'cr') + age + isMALE + diabetes + trop_t_s + shock + byst_cpr + gfr_0, data = df, family = "binomial") # 绘制3D图并保存坐标转换函数 par(cex = 1) trans <- vis.gam(gam.model, view = c("OtherBiomarker", "laktat_0"), plot.type = "persp", type = "response", theta = 320, phi = 25, color = "heat", xlab = "\n\nOtherBiomarker at admission", ylab = "\n\nLactate at admission", zlab = "\n\nPredicted Probability", border = "black", r = 100, ticktype = "detailed" )
方法一:添加地毯图(Rug Plot)
在X轴(OtherBiomarker)和Y轴(laktat_0)对应的底部平面绘制数据点的短线条,直观展示数据分布:
# 提取目标变量数据 x_data <- gam.model$model$OtherBiomarker y_data <- gam.model$model$laktat_0 # 获取轴范围 x_range <- range(x_data) y_range <- range(y_data) z_min <- 0 # 预测概率的最小值,对应Z轴底部 # 添加X轴(OtherBiomarker)地毯图:Y取最小值,Z取最小值平面 rug_x <- trans(x = x_data, y = rep(y_range[1], length(x_data)), z = rep(z_min, length(x_data))) segments(rug_x$x, rug_x$y, rug_x$x, rug_x$y + 0.02*diff(par("usr")[3:4]), col = "darkblue", lwd = 2) # 添加Y轴(laktat_0)地毯图:X取最小值,Z取最小值平面 rug_y <- trans(x = rep(x_range[1], length(y_data)), y = y_data, z = rep(z_min, length(y_data))) segments(rug_y$x, rug_y$y, rug_y$x + 0.02*diff(par("usr")[1:2]), rug_y$y, col = "darkred", lwd = 2)
方法二:添加密度函数图
将计算好的密度曲线映射到3D图的对应轴平面,展示数据分布的密度趋势:
# 计算密度 lactate_density <- density(y_data) OtherBiomarker_density <- density(x_data) # 标准化密度值到0~0.1(适配Z轴概率范围,可根据实际调整) norm_density_x <- lactate_density$y / max(lactate_density$y) * 0.1 norm_density_y <- OtherBiomarker_density$y / max(OtherBiomarker_density$y) * 0.1 # 添加X轴(OtherBiomarker)密度图:Y取最小值平面 density_x_coords <- trans(x = lactate_density$x, y = rep(y_range[1], length(lactate_density$x)), z = norm_density_x) lines(density_x_coords$x, density_x_coords$y, col = "darkblue", lwd = 2) # 添加Y轴(laktat_0)密度图:X取最小值平面 density_y_coords <- trans(x = rep(x_range[1], length(OtherBiomarker_density$x)), y = OtherBiomarker_density$x, z = norm_density_y) lines(density_y_coords$x, density_y_coords$y, col = "darkred", lwd = 2)
注意事项
- 若预测概率范围不是0~1(二项式模型一般是),需调整
z_min和密度标准化的范围; - 可修改
col、lwd、线段长度等参数优化可视化效果; - 若需添加Z轴(预测概率)的密度,可提取模型预测值后重复上述流程,选择合适的平面绘制。
内容的提问来源于stack exchange,提问作者Fabian.m
相关产品推荐
相关产品推荐

