我正在使用有光泽的应用程序制作covid案件的交互式ggplot
图。用户可以选择区域来查看新案例。目前,我的y轴会根据用户选择的区域中的病例数进行调整。
我希望y轴的下限始终为0,但要使y轴的上限至少开始50并根据所选数据进行扩展。否则,只有少数几个案例的小镇有很高的酒吧,这是不可取的。我知道我可以使用以下设置硬性上限和下限。
scale_y_continuous(limits=c(0,50))
但是我需要一些更复杂的东西,例如
scale_y_continuous(limits=c(0,50-400))
此功能是否存在?谢谢。
答案 0 :(得分:1)
为什么不在您的renderPlot()
函数中定义一个上限,该上限是50
或max(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)
我开始用另一条评论回答您的评论,但我认为最好对答案发表修改。考虑到您引用了您具有返回绘图数据框的功能(称为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")