如何根据R中的绘图更改scale_y_continuous的限制?

3
我想绘制带有观测数量的箱线图。问题在于,由于信息和异常值的不同,y轴会发生变化。因此,我想自动更改scale_y_continuous的限制。这可能吗?
这是一个可重现的示例:
library(dplyr)
library(ggplot2)

myFreqs <- mtcars %>%  
  group_by(cyl, am) %>% 
  summarise(Freq = n()) 
myFreqs

p <- ggplot(mtcars, aes(factor(cyl), drat, fill=factor(am))) +
  stat_boxplot(geom = "errorbar") +
  geom_boxplot() +
  stat_summary(geom = 'text', label = paste("n = ", myFreqs$Freq), fun = max, position = position_dodge(width = 0.77), vjust=-1)

p

image 1

这个想法是将具有最高y轴值的图的最大值至少增加1(在上述情况下,它将是n = 8的第二个箱形图)。
我尝试使用scale_y_continuous更改y轴,就像这样:
p <- p + scale_y_continuous(limits = c(0, 5.3))
p

image 2

然而,我不想限制自己,我想找到一种根据我的情节修改限制的方法。(因为...如果信息改变了怎么办?)。 有没有办法做到这样?使用 minmax --> scale_y_continuous(limits = c(min(x), max(x))) 非常感谢您的帮助。

2
limits参数接受一个函数,因此您可以使用scale_y_continuous(limits = function(x){c(min(x), max(x)})。请注意,提供的输入作为x是数据的自然限制,因此这个特定的函数不会改变任何东西。 - teunbrand
2
是的,在你的情况下,你可能正在寻找类似于 p + scale_y_continuous(limits = ~ c(0, max(.x) + 0.4)) 的东西。 - caldwellst
非常感谢您的回答!那正是我所需要的!@caldwellst,(.x)是什么意思?它是否像@teunbrand编写的函数的简化版本? - emr2
1
是的,这是 tidyverse 用于匿名函数的 lambda 格式,而不是 function(x),它基本上代表 function(.x)。如果使用 R >= 4.1,您还可以使用 \(x) 作为 function(x) 的速记。 - caldwellst
哇,非常感谢您提供的信息和帮助!@caldwellst - emr2
1个回答

4

感谢@teunbrand和@caldwellst,我得到了所需的解决方案。

有3种完美的解决方案:

1-

p + scale_y_continuous(limits = function(x){
  c(min(x), (max(x)+0.1))
    })
p

2-

library(tidyverse)

p + scale_y_continuous(limits = ~ c(min(.x), max(.x) + 0.1))

3-

p + scale_y_continuous(limits = function(x){
  c(min(x), ceiling(max(x) * 1.1))
})

我也在寻找这个。如果我想设置y轴的间断点,需要进行哪些编辑? - Jackson A Swan
@JacksonASwan 这个函数有一个参数可以设置断点。请查看此链接 https://www.geeksforgeeks.org/set-axis-breaks-of-ggplot2-plot-in-r/ - emr2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接