绘制非连续函数ggplot2

时间:2015-01-28 01:16:04

标签: r ggplot2

我试图在值0 - 1:

上绘制此函数
dweird <- function(x){
  if (x< 0){return(0)}
  if (x> 1){return(0)}
  if (x >= 0 & x < (1/3)) {return((1))}
  if (x >= (1/3) & x < (2/3)){return(3/2)}
  if (x >= (2/3) & x <= 1){return((1/2))}
}

这是我使用

的代码
library(ggplot2)
ggplot(data.frame(x=c(0, 1)), aes(x)) + 
  stat_function(fun=function(x) dweird(x), linetype="dotted")

但是这会返回错误消息

警告讯息: 在if(x> = 0&amp; x&lt;(1/3)){:   条件的长度> 1,只使用第一个元素

要清楚,该函数应绘制y = 1的一条直线,0-1 / 3,另一条y = 1.5,1 / 3-2 / 3,另一条线,1/2,2/3到1.

为什么我收到错误消息的任何想法?

2 个答案:

答案 0 :(得分:2)

您需要对您的功能进行矢量化。 ggplot并不期望一次评估一个点。懒惰的方式是使用vectorize

dweird_v_lazy = Vectorize(dweird)

但更好的方法是首先以这种方式对其进行编码:

dweird_v = function(x) {
    ifelse(x < 0, 0,
           ifelse(x < 1/3, 1,
                  ifelse(x < 2/3, 3/2,
                         ifelse(x < 1, 1/2, 0))))
}

然后这将正常工作:

x = seq(-.2, 1.2, length.out = 15)
dweird_v(x)
 [1] 0.0 0.0 0.0 1.0 1.0 1.0 1.5 1.5 1.5 0.5 0.5 0.5 0.0 0.0 0.0

你的情节也是如此:

library(ggplot2)
ggplot(data.frame(x=c(0, 1)), aes(x)) + 
    stat_function(fun= dweird_v, linetype="dotted")

请注意,当您将单个功能传递给stat_function时,您不必将其转换为匿名功能,您可以告诉它您的功能名称。

答案 1 :(得分:1)

你需要&#34;矢量化&#34;你的职能:

dweird <- Vectorize(dweird)