首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何扩展ggplot轴限值以包括最大值

如何扩展ggplot轴限值以包括最大值
EN

Stack Overflow用户
提问于 2018-11-29 05:07:39
回答 3查看 6.6K关注 0票数 8

通常,在绘图中,Y轴值标签在绘制的最大值以下被切分。

代码语言:javascript
复制
For example:

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

我知道scale_y_continous,但我想不出一个聪明的方法来做这件事。也许我只是想得太多了。我不想搞乱自动生成的“智能”中断。

我可能会试着手动处理.

代码语言:javascript
复制
  mtcars  %>% ggplot(aes(x=mpg, y=hp, color=as.factor(carb)))+geom_point()  + scale_y_continuous(limits = c(0,375))

但这不像我上面提到的,因为“聪明的休息”。对于我来说,是否可以将默认的中断间隔再延长到1,以便在这种情况下是400?当然,我希望这对于我正在使用的任何数据集来说都是灵活的。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-11-29 05:22:19

您可以使用expand_limits()来增加最大y轴值.您还可以确保最大y轴值被舍入数据规模上的下一个最高值,例如,第二个最高的几十个值,第二个最高的数百个值,等等,这取决于数据中的最高值是否在几十,数百,等等。

例如,下面的函数查找最大y值的基10日志,并将其舍入。这给出了y值最大值(例如,几十、数百、数千等)的基数10。然后,它将最大y轴值循环到最近的10,100等等,这比最大值y值还要高。

代码语言:javascript
复制
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范围数据可以直接从图中收集:

代码语言:javascript
复制
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)

代码语言:javascript
复制
p = iris %>% ggplot(aes(x=Sepal.Width, y=Petal.Width)) +
  geom_point()

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

票数 14
EN

Stack Overflow用户

发布于 2019-05-17 07:59:35

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

代码语言:javascript
复制
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,ste为50,而对于p3为100

票数 1
EN

Stack Overflow用户

发布于 2020-02-20 16:32:54

这里有一个解决方案,允许任何类型的数字比例尺:

代码语言:javascript
复制
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))
    )
  )

}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53532217

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档