绘制非连续函数ggplot2
Plotting Noncontinuous Function 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")
但是这个returns错误信息
警告信息:
在 if (x >= 0 & x < (1/3)) { 中:
条件的长度 > 1 且仅使用第一个元素
为了清楚起见,该函数应该在 y=1 处从 0-1/3 处绘制一条直线,在 y=1.5 处从 1/3-2/3 处绘制另一条直线,在 1/2 处从 2 处绘制另一条直线/3 到 1。
知道为什么我会收到该错误消息吗?
您需要向量化您的函数。 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))))
}
# or, more concisely with `cut`:
dweird_cut = function(x) {
as.numeric(as.character(
cut(x,
breaks = c(-Inf, 0, 1/3, 2/3, 1, Inf),
labels = c(0, 1, 1.5, .5, 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
时,您不必将其转换为匿名函数,只需告诉它您的函数名称即可。
您需要"vectorize"您的函数:
dweird <- Vectorize(dweird)
我试图在值 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")
但是这个returns错误信息
警告信息: 在 if (x >= 0 & x < (1/3)) { 中: 条件的长度 > 1 且仅使用第一个元素
为了清楚起见,该函数应该在 y=1 处从 0-1/3 处绘制一条直线,在 y=1.5 处从 1/3-2/3 处绘制另一条直线,在 1/2 处从 2 处绘制另一条直线/3 到 1。
知道为什么我会收到该错误消息吗?
您需要向量化您的函数。 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))))
}
# or, more concisely with `cut`:
dweird_cut = function(x) {
as.numeric(as.character(
cut(x,
breaks = c(-Inf, 0, 1/3, 2/3, 1, Inf),
labels = c(0, 1, 1.5, .5, 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
时,您不必将其转换为匿名函数,只需告诉它您的函数名称即可。
您需要"vectorize"您的函数:
dweird <- Vectorize(dweird)