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