使用sjPlot的plot_model绘制多层模型时定制配色与图例标签的问题
解决sjPlot plot_model交互效应图的配色与图例标签冲突问题
问题根源在于你同时使用了plot_model的colors参数和ggplot的scale_color_manual,两者都在定义颜色刻度,后者会覆盖前者,进而导致配色异常和警告提示。以下是两种可行的解决方案:
方案1:直接用plot_model内置参数设置标签(推荐)
利用plot_model的pred.labels参数直接指定三个分组的图例标签,同时保留colors参数设置自定义配色,无需额外添加scale层,从根源避免冲突:
library(lme4) library(sjPlot) library(merTools) colors <- c("red","darkred","pink") m1 = lmer(mathach ~ ses + meanses + ses*meanses + (1|schid), data=hsb) # 修正轴标签:原模型因变量是mathach,y轴应为数学成绩,x轴对应ses p1 <- plot_model(m1, type="pred", terms= c("ses","meanses"), colors= colors, legend.title = "Mean SES", pred.labels = c("Low (-1 SD)", "Average", "High (+1 SD)")) + labs(y="Math Achievement", x="SES") p1
pred.labels是plot_model专为连续变量自动生成的-1SD、均值、+1SD分组设计的参数,既能保留自定义颜色,又能替换图例标签,不会触发刻度冲突警告。
方案2:统一用ggplot scale控制配色与标签
如果习惯用ggplot的scale语法,就不在plot_model里设置colors参数,完全交给scale_color_manual同时定义颜色和标签:
library(lme4) library(sjPlot) library(merTools) colors <- c("red","darkred","pink") m1 = lmer(mathach ~ ses + meanses + ses*meanses + (1|schid), data=hsb) p1 <- plot_model(m1, type="pred", terms= c("ses","meanses"), legend.title = "Mean SES") + labs(y="Math Achievement", x="SES") + scale_color_manual(labels = c("Low (-1 SD)", "Average", "High (+1 SD)"), values=colors) p1
这种方式只生成一次颜色刻度,不会出现重复覆盖的问题,同样能得到预期效果。
内容的提问来源于stack exchange,提问作者Becky B
相关产品推荐
相关产品推荐

