如何扩展 ggplot 的 y 轴限制以包括最大值

8
通常在绘制图表时,Y轴值标签会被截断,显示的最大值以下的部分会被省略。
For example:

library(tidyverse)
mtcars %>% ggplot(aes(x=mpg, y = hp))+geom_point()

我知道scale_y_continuous函数-但是我无法想出一个聪明的方法来实现这一点。也许我只是过于深思熟虑了。 我不希望破坏自动生成的“智能”断点。

也许我会尝试手动操作...

  mtcars  %>% ggplot(aes(x=mpg, y=hp, color=as.factor(carb)))+geom_point()  + scale_y_continuous(limits = c(0,375))

enter image description here

但是,由于“智能换行”,上述方法无法奏效。有没有办法将默认的分隔间隔扩展到 1,以便在这种情况下为 400?当然,我希望这个方法对任何数据集都是灵活适用的。

4个回答

14
您可以使用expand_limits()函数来增加y轴的最大值。您也可以确保最大y轴值舍入到数据刻度的下一个更高的值,例如,下一个更高的十位数值、百位数值等,具体取决于数据中的最高值是否在十位数、百位数等范围内。
例如,下面的函数找到最大y值的以10为底的对数并将其向下舍入。这给我们了最大y值的以十为底的刻度(例如,十、百、千等)。然后将最大y轴值向上舍入到比最大y值更高的最近的十位数、百位数等。
expandy = function(vec, ymin=NULL) {

  max.val = max(vec, na.rm=TRUE)
  min.log = floor(log10(max.val))

  expand_limits(y=c(ymin, ceiling(max.val/10^min.log)*10^min.log))
}

p = mtcars %>% ggplot(aes(x=mpg, y = hp)) +
  geom_point()

p + expandy(mtcars$hp)

p + expandy(mtcars$hp, 0)

或者,为了让事情变得更容易些,你可以设置函数,使得 y 轴范围数据直接从图中收集:

library(gridExtra)

expandy = function(plot, ymin=0) {

  max.y = max(layer_data(plot)$y, na.rm=TRUE)
  min.log = floor(log10(max.y))

  expand_limits(y=c(ymin, ceiling(max.y/10^min.log)*10^min.log))
}

p = mtcars %>% ggplot(aes(x=mpg, y = hp)) +
  geom_point()

grid.arrange(p, p + expandy(p), ncol=2)

输入图像描述

p = iris %>% ggplot(aes(x=Sepal.Width, y=Petal.Width)) +
  geom_point()

grid.arrange(p, p + expandy(p), ncol=2)

在此输入图片描述


这可能是一个愚蠢的问题,但我该如何将其添加到主题中呢?我可以仔细研究它,但想知道是否有快速解决方案。 - runningbirds
很棒的功能,感觉应该被集成到包中。 - Brandon

2
选择一个断开y轴的步骤,您可以使用ceiling()函数。
library(gridExtra)

p1 <- mtcars %>% ggplot(aes(x=mpg, y = hp)) + geom_point() 

p2 <- p1 +
  scale_y_continuous(
    limits = c(0, ceiling(max(mtcars$hp)/50)*50), 
    breaks = seq(0, ceiling(max(mtcars$hp)/50)*50, 50)
  ) 

p3 <- p1 + scale_y_continuous(
  limits = c(0, ceiling(max(mtcars$hp)/100)*100), 
  breaks = seq(0, ceiling(max(mtcars$hp)/100)*100, 100)
) 

grid.arrange(p1, p2, p3, ncol=3)

对于 p2,步长为 50,而对于 p3,步长为 100。

enter image description here


1

这里有一个相当简单的答案,只需将一个限制设置为NA

mtcars %>% 
  ggplot(aes(x=mpg, y=hp, color=as.factor(carb))) + 
  geom_point() + 
  scale_y_continuous(limits = c(0, NA))

0

这里有一个解决方案,可以允许任何类型的数字刻度:

expandy <- function(y, base, v_min = NULL) {

  max.val <- max(y, na.rm = TRUE)

  expand_limits(
    y = c(
      v_min, 
      base * (max.val %/% base + as.logical(max.val %% base))
    )
  )

}

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