如何修改plot_model()的X轴刻度标签并拉近图中线条间距?
问题解答
1. 为何c161sex的X轴显示为"male"和"female"?
因为你用了sjmisc::to_factor()函数处理c161sex,而efc是自带变量标签的数据集,这个函数会自动读取变量的标签属性,将原始数值(1、2)替换为对应的标签文本(male、female),而非保留原始数值作为因子水平。
2. 如何替换plot_model生成图的X轴刻度?
你之前用scale_x_discrete(limits = c("Not Fun", "Fun"))导致刻度消失,是因为limits参数用于指定因子水平的顺序/存在性,而非替换标签。正确做法是用breaks对应原始因子水平,labels设置新标签:
针对你的示例代码修改:
plot_model(h, type = "pred", terms = c("X", "Z")) + xlab("Fun Level") + ylab("") + theme_bw() + theme(legend.title = element_blank()) + # 用breaks匹配原始因子水平,labels设置新标签 scale_x_discrete(breaks = c("0", "1"), labels = c("Not Fun", "Fun"))
更稳妥的方式是直接在数据中修改因子标签,这样plot_model会自动使用修改后的标签,无需额外添加scale:
# 直接修改X的因子标签 data$X <- factor(data$X, levels = c("0", "1"), labels = c("Not Fun", "Fun")) # 重新拟合模型并绘图 h <- lm_robust(Y ~ X*Z, data = data) plot_model(h, type = "pred", terms = c("X", "Z")) + xlab("Fun Level") + ylab("") + theme_bw() + theme(legend.title = element_blank())
3. 如何让图中线条间距更近?
可以通过两种方式调整:
- 缩小Y轴空白范围:用
scale_y_continuous(expand = c(0, 0))去掉Y轴上下的空白,让线条更紧凑;若需保留少量空白,可调整参数如expand = c(0.05, 0)。 - 手动设置Y轴范围:用
coord_cartesian(ylim = c(min_value, max_value))指定Y轴的最小/最大值,直接压缩线条垂直间距。
示例代码(结合你的数据集):
plot_model(h, type = "pred", terms = c("X", "Z")) + xlab("Fun Level") + ylab("") + theme_bw() + theme(legend.title = element_blank()) + scale_x_discrete(breaks = c("0", "1"), labels = c("Not Fun", "Fun")) + # 缩小Y轴空白,让线条更紧凑 scale_y_continuous(expand = c(0, 0))
内容的提问来源于stack exchange,提问作者hy9fesh
相关产品推荐
相关产品推荐

