如何在图表的X 轴上缩小两个分类变量之间的间距?

编程语言 2026-07-09

我想绘制一个分类变量(有两个水平:pers_whobreaksup)与一个连续变量(avd_mc)之间的双因素交互图。

X轴上的空白太多了。无论我怎么调整都无法减少。

我在使用scale_x_continious,因为使用scale_x_discrete总是会把分类变量的标签从图中移除。

我可以把用于避免的那几条线拉得更近一些,但标签不会移动,X轴的长度保持不变
我已附上当前绘图的样子以及下面的代码。

当前绘图

plot_model(persconf_mean_mod1.2, 
           type = "pred", 
           terms = c("pers_whobreaks", 
                     "avd_mc[-1.114652, 1.114652]")) + 
  scale_color_discrete(name = "Attachment Avoidance", 
                       labels = c("Low", "High"))+ 
  scale_x_continuous( labels = c("Partner Breaksup" , "You Breakup"), n.breaks = 2) + 
  ggtitle("")+ ylab(label = "Personal Confidence") + 
  xlab(label = "Initiator")+ 
  theme_classic() + 
  theme(text = element_text(family = "serif"))

解决方案

你可以间接控制“留白”量,这取决于绘图本身的宽度(由你的绘图设备决定)以及每组中条形被错位的紧密程度和/或在两边添加的空白量。

设想我们有这张图,与你的一张类似。最好在提问中包含示例数据,但我认为你的问题也可以用其他数据来演示。

p <- sjPlot::plot_model(lm(mpg ~ wt + am + vs, 
                        data = mtcars |> transform(am = factor(am))),
                        type = "pred", terms = c("am", "vs")) 

ggsave("p.png", p, width = 4, height = 3, scale = 2)

在此输入图片描述

如果把图变窄(最直接地通过调整Plot窗口的大小来实现,但更具可重复性的是使用 ggsave()),并增大dodge的比例,我们就能在每组中的条形之间获得类似的物理间距,但之间的间隔会变小。

p2 <- sjPlot::plot_model(lm(mpg ~ wt + am + vs, 
                           data = mtcars |> transform(am = factor(am))),
                        type = "pred", terms = c("am", "vs"), dodge = 0.5) 

ggsave("p2.png", p2, width = 2, height = 3, scale = 2)

(很恼人的是,Stack Overflow会把这张图显示得更大以填充宽度;原始文件的高度是相同的。)

在此输入图片描述

如果我们想要相同的绘图尺寸,可以在两边添加填充/留白:

p3 <- sjPlot::plot_model(lm(mpg ~ wt + am + vs, 
                            data = mtcars |> transform(am = factor(am))),
                         type = "pred", terms = c("am", "vs"), dodge = 0.5) +
  scale_x_continuous(expand = expansion(mult = c(1, 1)))

ggsave("p3.png", p3, width = 4, height = 3, scale = 2)

在此输入图片描述

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章