Ggplot2条形图,geom 的底部和 x 轴之间没有空间,保持上面的空间

当我在 ggplot2中绘制条形图时,我希望将条形图底部与 x 轴之间的空间减少到0,同时保持条形图和绘图框之上的空间。我有一个黑客做到这一点。它很脏,我想重新洗干净。有没有一种方法可以实现这种行为而不用那个肮脏的小黑客?

默认值(需要上面的空间,但不需要下面的空间) :

ggplot(mtcars, aes(x=as.factor(carb))) +
geom_bar()

enter image description here

使用展开(上面不需要0个空格,但下面得到了0个空格) :

ggplot(mtcars, aes(x=as.factor(carb))) +
geom_bar() +
scale_y_continuous(expand = c(0,0))

enter image description here

Dirty Hack (我喜欢它,但是... ... 呃,很下流) :

ggplot(mtcars, aes(x=as.factor(carb))) +
geom_bar() +
scale_y_continuous(expand = c(0,0)) +
geom_text(aes(x=1, y=10.3, label="Stretch it"), vjust=-1)

enter image description here

62853 次浏览

我可能会错过你真正想要的,但没有使用 geom_text黑客你仍然可以设置的限制

ggplot(mtcars, aes(x = as.factor(carb))) +
geom_bar() +
scale_y_continuous(expand = c(0, 0), limits = c(0, 10.3))


# marginally cleaner

因为你看起来很喜欢硬编码。

ggplot(mtcars, aes(x = as.factor(carb))) +
geom_bar() +
coord_cartesian(ylim = c(0, 10.3))

您可以手动扩展限制,例如使用 expand_limits(y=10.1),或者使用这个技巧来添加一个不可见的层,其中包含按比例放大的数据,

ggplot(mtcars, aes(x=as.factor(carb))) +
geom_bar() +
scale_y_continuous(expand = c(0,0)) +
geom_blank(aes(y=1.1*..count..), stat="bin")

这是一种自动生成顶部间距,但删除底部间距的方法。我用了3% 的填充,因为这是你硬编码的。

plot1 <- ggplot(mtcars, aes(x=as.factor(carb))) +
geom_bar()


plotInfo <- print(plot1)
yMax <- max(plotInfo$data[[1]]$ymax)
yLimitMax <- 1.03 * yMax


plot2 <- plot1 +
scale_y_continuous(expand = c(0,0),
limits = c(0,yLimitMax))

如果你想删除三行之间的情节,只需要写在 plot2:

limits = c(0, 1.03 * max(print(plot1)$data[[1]]$ymax))

Ggplot23.0.0开始,有一个 expand_scale()函数,可以与 expand参数一起使用来完成这项工作。您可以分别定义顶部和底部扩展。

ggplot(mtcars, aes(x=factor(carb))) +
geom_bar() +
scale_y_continuous(expand = expand_scale(mult = c(0, .1)))

R 文档包括一个新的方便函数,称为 expansion,用于 expand参数,因为 expand_scale()Ggplot2 v3.3.0发布版开始就不推荐使用了。

ggplot(mtcars) +
geom_bar(aes(x = factor(carb))) +
scale_y_continuous(expand = expansion(mult = c(0, .1)))