动态使用漂亮的休息范围在ggplot中设置限制

时间:2018-12-13 01:54:25

标签: r ggplot2 plot

嗨,我想动态设置图的限制,以确保在顶部数据点上方有一个中断。它必须是动态的,因为我想在基本图中进行所有格式设置,但是随后可以添加不同的数据而不必更改硬编码的轴限制,或者有很多不同的情况,我必须先调用获取限制然后进行设置(例如,如in this question所示)。我知道我可以将其包装在自己的函数中,但我希望有一种默认方法。

我正在使用scales::pretty_breaksscale_y_continuous内休息。理想情况下,我希望能够按照scale_y_continuous( breaks=pretty_breaks(), limits = range(pretty_breaks()))的方式进行设置,但这是行不通的,并且我假设pretty_breaks仅在breaks调用中默认有效。

library(ggplot2)
library(scales)
set.seed(1)
rdat <- data.frame(x = 1:1000,y=runif(1000,min = 0, max = 107))

ggplot(rdat, aes(x =x, y = y))+geom_point()+
  scale_y_continuous( breaks=pretty_breaks())

我可以添加:

ggplot(rdat, aes(x =x, y = y))+geom_point()+
   scale_y_continuous( breaks=pretty_breaks(), limits = range(pretty_breaks()(rdat$y)))

可以,但是需要我尝试避免对data.frame和y标签进行硬编码。

所以代替这个: Instead of this

我想要这个: I want this version

1 个答案:

答案 0 :(得分:0)

我在很久之后再次出现这个问题,并找到了更严格(虽然不美观)的方法。发帖以防其他人觉得有用。

这需要自定义限制和自定义中断功能。自定义中断函数是必需的,因为当您调用 breaks=pretty_breaks() 时,会传递绘图的限制,但这些限制都已由 limits=... 调整,然后也扩展(符合 expand = ... }} 默认情况下乘以 0.05)。因此,为了确保漂亮的中断与基于原始漂亮中断的限制一致,您需要尝试反向推导,尤其是扩展。这不会是 100% 完美的,并假定默认扩展。

我还包括了一个阈值,因此限制不会低于 0,这对我很有用,因为我处理的数字是严格的正数,但可能接近 0,因此小的扩展会将其推低至 0 以下。但可能对别人没那么有用

library(ggplot2)
library(scales)
set.seed(1)
rdat <- data.frame(x = 1:1000,y=runif(1000,min = 0, max = 107))

pretty_lim <- function(x,n=5){
  #pretty_lim
  r2 <- ifelse(x <0, 0, x)
  pr <- pretty(r2,n)
  r_out <- range(pr)
  r_out
}


pretty_unexpanded <- function(x,n=5){
  #expand_limit
  if(x[1]<=0){
    r2 <- x + c(-x[1],x[1])
  }else{
    r2 <- x + c((x[2]-x[1])*0.04545455,-(x[2]-x[1])*0.04545455)
  }
  pout <-  pretty(r2,n) 
  pout
}

#expand near 0
ggplot(rdat, aes(x =x, y = y))+geom_point()+
  scale_y_continuous( breaks=pretty_unexpanded,limits = pretty_lim )

#another case no where near 0
rdat2 <- rdat
rdat2$y <- rdat2$y +45

ggplot(rdat2, aes(x =x, y = y))+geom_point()

#Raw Plot

ggplot(rdat2, aes(x =x, y = y))+geom_point()+
  scale_y_continuous( breaks=pretty_unexpanded,limits = pretty_lim )

#updated plot with new limits and breaks

reprex package (v0.3.0) 于 2021 年 6 月 7 日创建