通常在图中,Y轴值标签会在要绘制的最大值以下被切掉。
For example:
library(tidyverse)
mtcars %>% ggplot(aes(x=mpg, y = hp))+geom_point()
Run Code Online (Sandbox Code Playgroud)
我知道scale_y_continous-但我想不出一种聪明的方法来做到这一点。也许我只是在想什么。我不想弄乱自动生成的“智能”中断。
我可能会尝试手动进行此操作...
mtcars %>% ggplot(aes(x=mpg, y=hp, color=as.factor(carb)))+geom_point() + scale_y_continuous(limits = c(0,375))
Run Code Online (Sandbox Code Playgroud)
但这由于“智能中断”而无法像我上面提到的那样起作用。无论如何,我是否需要将默认的中断间隔延长到另外1个,因此在这种情况下将是400个?当然,我希望它对于我正在使用的任何数据集都具有灵活性。
您可以使用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)
Run Code Online (Sandbox Code Playgroud)
或者,为使操作更简单,可以设置函数,以便直接从图中收集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)
Run Code Online (Sandbox Code Playgroud)
p = iris %>% ggplot(aes(x=Sepal.Width, y=Petal.Width)) +
geom_point()
grid.arrange(p, p + expandy(p), ncol=2)
Run Code Online (Sandbox Code Playgroud)