除了scale_x/y_continuous 之外,您可能还需要添加coord_cartesian。 scale_x/y_continuous 会删除图表范围之外的点,但coord_cartesian 会覆盖它并使用所有数据,即使其中一些数据在图表中不可见。在您的图中,红色点的置信带结束于带顶部超出图表 y 范围的位置。
在您的图表的扩展范围内没有实际的“数据”,但geom_smooth 将它生成的用于绘制置信带的点视为“数据”,以便决定绘制什么。
看看下面的例子。第一个情节仅使用scale_x/y_continuous。第二个添加coord_cartesian,但请注意,仍然没有绘制置信带。在第三个图中,我们仍然使用coord_cartesian,但我们向下扩展了scale_y_continuous 范围,以便置信带中低于零的点包含在y 范围内。但是,coord_cartesian 决定了实际绘制的范围,还可以防止排除范围之外的点。
我实际上发现这种行为令人困惑。我原以为您可以单独使用 coord_cartesian 和所需的 x 和 y 范围,并且仍然可以将置信带和回归线一直绘制到图表的边缘。无论如何,希望这能满足您的需求。
p1 = ggplot(mtcars, aes(wt, mpg, colour=factor(am))) +
geom_smooth(fullrange=TRUE, method="lm") +
scale_x_continuous(expand=c(0,0), limits=c(0,10)) +
scale_y_continuous(expand=c(0,0), limits=c(0,100)) +
ggtitle("scale_x/y_continuous")
p2 = ggplot(mtcars, aes(wt, mpg, colour=factor(am))) +
geom_smooth(fullrange=TRUE, method="lm") +
scale_x_continuous(expand=c(0,0), limits=c(0,10)) +
scale_y_continuous(expand=c(0,0), limits=c(0,100)) +
coord_cartesian(xlim=c(0,10), ylim=c(0,100)) +
ggtitle("Add coord_cartesian; same y-range")
p3 = ggplot(mtcars, aes(wt, mpg, colour=factor(am))) +
geom_smooth(fullrange=TRUE, method="lm") +
scale_x_continuous(expand=c(0,0), limits=c(0,10)) +
scale_y_continuous(expand=c(0,0), limits=c(-50,100)) +
coord_cartesian(xlim=c(0,10), ylim=c(0,100)) +
ggtitle("Add coord_cartesian; expanded y-range")
gridExtra::grid.arrange(p1, p2, p3)