R语言 如何扩展ggplot y轴限制以包括最大值

zxlwwiss  于 2023-02-17  发布在  其他
关注(0)|答案(4)|浏览(459)

通常,在绘图中,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))

但是由于“智能中断”的原因,这并不像我上面提到的那样工作。我是否可以将默认中断间隔再延长1,这样在本例中它将是400?当然,我希望这对于我正在使用的任何数据集都是灵活的。

8hhllhi2

8hhllhi21#

您可以使用expand_limits()来增加最大y轴值。您还可以确保最大y轴值上舍入到数据刻度上的下一个最大值,例如,下一个最大十位数值、下一个最大百位数值等,具体取决于数据中的最大值是否在十位数、百位数等范围内。
例如,下面的函数求出最大y值的以10为底的对数,并将其向下舍入。这给出了最大y值的以10为底的刻度(例如,十、百、千等)。然后,它将最大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)

798qvoo8

798qvoo82#

可以使用ceiling()函数选择断开y轴的步长

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

wvt8vs2t

wvt8vs2t3#

这里的解决方案,允许任何类型的数字规模:

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))
    )
  )

}
oxosxuxt

oxosxuxt4#

答案非常简单,只需为NA设置一个限制:

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

相关问题