如何在不修改底层数据的情况下调整plot_model的分面顺序?
解决sjPlot plot_model分面顺序异常问题
问题背景
使用sjPlot包的plot_model()函数绘制预测边际效应图,指定了数值型变量height的三个水平(对应-1 SD、均值、+1 SD),但分面默认按字母排序,导致顺序不符合逻辑(如-1 SD对应的height=-2排在均值对应的height=-1之后)。希望在不修改原始数据集的前提下,快速调整分面顺序。
原代码
library(dplyr) library(sjPlot) # 构建模型 model = lm(mass ~ gender*species*height, data = starwars[starwars$species %in% c("Human", "Droid", "Twi'lek"),]) # 绘制预测边际效应图,指定height的三个水平 plot = plot_model(model, type = "pred", terms = c("species", "gender", "height [-2, -1, 1]"), ci.lvl=0.95) # 重命名分面标签 plot$data$facet <- ifelse(plot$data$facet == "height = -2", "height = -2 (-1 SD)", ifelse(plot$data$facet == "height = -1", "height = -1 (mean)", ifelse(plot$data$facet == "height = 1", "height = 1 (+1 SD)", 99)))
当前绘图效果:分面按字母顺序排列,显示顺序为height = -1 (mean)、height = -2 (-1 SD)、height = 1 (+1 SD),不符合从-1 SD到均值再到+1 SD的逻辑顺序。
便捷解决方案
无需修改原始数据集,只需将绘图数据中的facet列转换为因子类型并指定自定义水平顺序,即可让分面按预期排列:
# 调整分面顺序:将facet列转为因子,按需求指定水平顺序 plot$data$facet <- factor(plot$data$facet, levels = c("height = -2 (-1 SD)", "height = -1 (mean)", "height = 1 (+1 SD)")) # 重新绘图 plot
原理说明
ggplot的分面默认按变量的自然顺序排列:若为字符型则按字母排序,若为因子则按因子水平顺序排序。这里仅修改了绘图对象内部的facet列类型,完全不触碰原始数据集或模型数据,是最轻量化的调整方式。
内容的提问来源于stack exchange,提问作者kommoder_Waran
相关产品推荐
相关产品推荐

