将原点强制从0开始

203

我如何在ggplot2中设置y轴和x轴的原点/截距?

x轴线应该恰好在y=Z处。

其中Z可以是0或另一个给定的值。

4个回答

267

xlimylim 在这里无法满足需求。需要使用 expand_limitsscale_x_continuousscale_y_continuous。尝试使用以下代码:

df <- data.frame(x = 1:5, y = 1:5)
p <- ggplot(df, aes(x, y)) + geom_point()
p <- p + expand_limits(x = 0, y = 0)
p # not what you are looking for

在这里输入图片描述

p + scale_x_continuous(expand = c(0, 0)) + scale_y_continuous(expand = c(0, 0))

enter image description here

您可能需要稍微调整一下,以确保点不会被截断(例如,请参见x = 5y = 5处的点)。


36
我还需要指定范围限制:scale_x_continuous(expand = c(0, 0), limits = c(0,5)),如果没有这个,它就无法正常工作。 - JelenaČuklina
6
我认为再加一点内容会有帮助,就是使用像 expand=expand_scale(mult=c(0,0.1)) 这样的东西,这样你仍然可以在上端获得填充效果:https://dev59.com/tF8d5IYBdhLWcg3wQwW5#59056123 - Michael Roswell

38

只需将它们添加到您的 ggplot 中:

+ scale_x_continuous(expand = c(0, 0), limits = c(0, NA)) + 
  scale_y_continuous(expand = c(0, 0), limits = c(0, NA))

例子

df <- data.frame(x = 1:5, y = 1:5)
p <- ggplot(df, aes(x, y)) + geom_point()
p <- p + expand_limits(x = 0, y = 0)
p # not what you are looking for


p + scale_x_continuous(expand = c(0, 0), limits = c(0,NA)) + 
  scale_y_continuous(expand = c(0, 0), limits = c(0, NA))

在此输入图片描述

最后,务必小心不要无意中从您的图表中排除数据。例如,position = 'dodge'可能会导致柱形图完全被遗漏(例如,如果其值为零,并且您从零开始轴),因此您可能看不到它,甚至不知道它在那里。我建议先完整绘制数据,进行检查,然后使用上述技巧来改善图表的美观度。


这个能否构建成一个新的ggplot主题? - Bolle
1
@Bolle 我不确定,但也很感兴趣了解,你可以提出一个单独的问题并链接到这里。 - stevec
此链接以供参考。 - stevec
2
在我看来,展示包括“limits”的必要性的最佳答案。 - Bouncner
根据我的经验,添加limits=c(0,NA)的好处是可以使“0”出现在轴标签上。如果没有它,绘图区域将包括0,但通常0不会出现在轴标签上。 - mac
使用scale_y_continuous(expand = c(0, 0), limits = c(0, NA))影响了我的图表的上限。我发现只使用scale_y_continuous(limits = c(0, NA))更加成功。 - Mateus Figueiredo

7
在最新版本的ggplot2中,这可以更加简单。
p <- ggplot(mtcars, aes(wt, mpg))
p + geom_point()
p+ geom_point() + scale_x_continuous(expand = expansion(mult = c(0, 0))) + scale_y_continuous(expand = expansion(mult = c(0, 0)))

在此输入图片描述

有关更多详情,请参见?expansion()


2
这只是改变数据点周围的填充,但不能帮助设置轴原点为零或其他所需值。 - Melkor.cz

5
另一种选择是使用 coord_cartesian 并设置 expand = FALSE。限制将根据数据或基于您的限制进行取值。以下是一个可重现的示例:
df <- data.frame(x = 1:5, y = 1:5)

library(ggplot2)
p <- ggplot(df, aes(x, y)) + geom_point()
p <- p + expand_limits(x = 0, y = 0)
p + coord_cartesian(expand = FALSE)

本文创建于2022-11-26,使用 reprex v2.0.2 工具。

您也可以直接在 coord_cartesian 中指定限制,如下所示:

df <- data.frame(x = 1:5, y = 1:5)

library(ggplot2)
p <- ggplot(df, aes(x, y)) + geom_point()
p + coord_cartesian(expand = FALSE, xlim = c(0, NA), ylim = c(0, NA))

使用reprex v2.0.2于2022年11月26日创建


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接