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

Tyl*_*ker 45 r ggplot2

当我在ggplot2中绘制条形图时,我想将条形底部和x轴之间的空间减小到0,同时保持条形图和绘图框上方的空间.我有一个黑客在下面这样做.它很脏,我想再次清洁.有没有办法在没有肮脏的小黑客的情况下实现这种行为?

默认(上面所需的空格但不希望空格下方的空格):

ggplot(mtcars, aes(x=as.factor(carb))) + 
    geom_bar()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

使用展开(上面不需要的0空格但是在条形下面有0个空格):

ggplot(mtcars, aes(x=as.factor(carb))) + 
    geom_bar() + 
    scale_y_continuous(expand = c(0,0)) 
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

肮脏的黑客(我喜欢它,但它......好吧,脏):

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)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

use*_*1_G 38

我可能会错过你真正想要的东西,但是如果不使用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
Run Code Online (Sandbox Code Playgroud)


sam*_*sam 21

R 文档包括一个新的便利函数expansion,该expand函数在ggplot2 v3.3.0 版本中expand_scale()已被弃用,该函数调用该参数。

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

  • 这是正确答案,应该会收到复选标记。 (2认同)

bap*_*ste 19

您可以手动扩展限制,例如使用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")
Run Code Online (Sandbox Code Playgroud)

  • 我仍然不明白 - `.count..`变量负责y轴的这种自动调整,但在某些时候由用户决定应该在栏上方添加什么边距(这里10%的完整数据范围)这就是这个倍增因子的作用.它与基础R和ggplot2中的默认轴相同. (2认同)

Hen*_*rik 8

因为你似乎对某些硬编码感到满意......

ggplot(mtcars, aes(x = as.factor(carb))) + 
  geom_bar() +
  coord_cartesian(ylim = c(0, 10.3))
Run Code Online (Sandbox Code Playgroud)


aos*_*ith 8

ggplot2 3.0.0开始,有一个expand_scale()函数可以与expand参数一起使用来实现此目的。您分别定义顶部和底部扩展。

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