有没有一种方法可以指定轴的上限的范围?

时间:2020-07-07 18:07:20

标签: r ggplot2

我正在使用有光泽的应用程序制作covid案件的交互式ggplot图。用户可以选择区域来查看新案例。目前,我的y轴会根据用户选择的区域中的病例数进行调整。

我希望y轴的下限始终为0,但要使y轴的上限至少开始50并根据所选数据进行扩展。否则,只有少数几个案例的小镇有很高的酒吧,这是不可取的。我知道我可以使用以下设置硬性上限和下限。

scale_y_continuous(limits=c(0,50))

但是我需要一些更复杂的东西,例如

scale_y_continuous(limits=c(0,50-400))

此功能是否存在?谢谢。

2 个答案:

答案 0 :(得分:1)

为什么不在您的renderPlot()函数中定义一个上限,该上限是50max(y_value)的最大值?像这样的事情应该起作用,其中plot_function()是应用程序中的renderPlot()函数:

set.seed(1234)
x <- 1:100

df1 <- data.frame(x,y=sample(1:10, 100, replace=TRUE))
df2 <- data.frame(x,y=sample(1:500, 100, replace=TRUE))

plot_function <- function(d) {
  upper_lim <- max(c(50, max(d$y)))
  p <- ggplot(d, aes(x,y)) + geom_point() +
    ylim(0,upper_lim) +
    ggtitle(deparse(substitute(d)))  # prints name of d object
  print(p)
}

比较plot_function()df1发送df2时的图(为清楚起见,使用cowplot

library(cowplot)
p1 <- plot_function(df1)
p2 <- plot_function(df2)
plot_grid(p1,p2)

enter image description here

renderPlot()函数应该是什么样?

我开始用另一条评论回答您的评论,但我认为最好对答案发表修改。考虑到您引用了您具有返回绘图数据框的功能(称为plotdata()),这是我尝试的方法。请注意,upper_lim需要在函数中定义,然后用于ggplot()调用。我发现在renderPlot()中将图存储到变量中,然后在print()中将图存储为变量最简单:

output$my_plot <- renderPlot({
  upper_lim <- max(c(50, max(plotdata()$y)))
  p <- ggplot(...) + ylim(0, upper_lim)
  print(p)
})

答案 1 :(得分:1)

或者,您可以将比例尺的界限设置为返回正确界限的函数。它以自然数据限制作为输入,并应返回长度为2的数字矢量。

一些示范:

library(ggplot2)
#> Warning: package 'ggplot2' was built under R version 4.0.2

df <- data.frame(
  x = c(1:5, 1:5),
  y = c(1:5, seq(100, 500, by = 100)),
  group = rep(LETTERS[1:2], each = 5)
)

yscale <- scale_y_continuous(
  limits = function(x){c(0, max(50, x[2]))}
)


base <- ggplot(df, aes(x, y))

base + geom_point(data = subset(df, group == "A")) +
  yscale

base + geom_point() +
  yscale

base + geom_point() +
  yscale +
  facet_wrap(~ group, scales = "free")