【问题标题】:How to change the limits from scale_y_continuous depending on the plot in R?如何根据 R 中的图更改 scale_y_continuous 的限制?
【发布时间】:2022-10-21 17:22:55
【问题描述】:

我想绘制顶部观察次数的箱线图。问题在于,根据信息和异常值,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

这个想法是至少增加+1到具有最高y轴值的图的最大值(在上面解释的情况下,这将是n = 8的第二个箱线图)

我尝试使用scale_y_continuous 更改 y 轴,如下所示:

p <- p + scale_y_continuous(limits = c(0, 5.3))
p

但是,我不想自己设置限制,我想找到一种根据我拥有的地块修改限制的方法。 (因为……如果信息发生变化怎么办?)。 有没有办法做这样的事情? minmax --> scale_y_continuous(limits = c(min(x), max(x)))

首先十分感谢

【问题讨论】:

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

标签: r ggplot2 boxplot yaxis


【解决方案1】:

感谢@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))
})

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2016-03-01
  • 2018-03-15
  • 2019-10-07
  • 1970-01-01
  • 2020-08-07
  • 1970-01-01
  • 1970-01-01
  • 2018-04-12
相关资源
最近更新 更多