想在[a,b]之间绘制一个函数,并在同一图表阴影下[c,d]下的区域,其中c和d位于a和b之间

时间:2016-10-12 15:27:55

标签: r ggplot2

我正在尝试使用ggplot绘制一个函数,我可以这样做。例如,y = x。我在-1和4之间绘图。很棒。在同一个图表上,我现在想要将曲线下面积区分为1到3.我无法使其工作,也无法找到任何文档。有人能帮助我吗?

我正在尝试的骨架代码:

eq<-function(x){(x)}

ggplot(data.frame(x=c(-1,4)),aes(x)) + 
stat_function(fun=eq,geom="line",color="red") + 
stat_function(fun=eq,geom="area",fill="blue")

我尝试了所有不同的排列。如果有办法将第二个stat_function限制到另一个域,它可能会起作用。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

似乎stat_function正在处理所有数据,而不是提供的特定值。一种选择是首先生成要绘制的数据,然后将其传递给特定的geom_*。但是,如果你真的想留在stat_function,你可能需要做更多的工作。一种方法是创建两个函数,其中一个函数将输出限制在您想要的范围内。

eq<-function(x){(x)}
eqB<-function(x){ifelse(x < 3 & x > 0, x, NA)}

ggplot(data.frame(x=c(-1,4)),aes(x)) + 
  stat_function(fun=eq,geom="line",color="red") + 
  stat_function(fun=eqB,geom="area",fill="blue")

更强大的解决方案是创建一个接受范围限制的单个函数,然后使用args传递这些函数:

eqC <- function(x,upr = max(x), lwr = min(x)){
  ifelse(x <= upr & x >= lwr, x, NA)
}

ggplot(data.frame(x=c(-1,4)),aes(x)) + 
  stat_function(fun=eqC,geom="line",color="red") + 
  stat_function(fun=eqC,geom="area",fill="blue"
                , args = list(upr = 3, lwr = 0))

这两个都会生成如下图:

enter image description here