为何在ggplot2分段函数中把>=改为>后连续图形突变?
分段函数绘图异常原因分析
问题描述
原本使用ggplot2绘制分段函数的代码可以正常运行:
fun1 <- function(x){ ifelse(x<=-2, -1.5*(-x)^2, NA) } fun2 <- function(x){ ifelse(x>-2, 6*x-5, NA) } gg <- ggplot(data.frame(x = c(-5, 5)), aes(x = x))+ stat_function(fun = fun1, n=1001)+ stat_function(fun = fun2, n=1001) print(gg)
但将条件修改为ifelse(x<-2, -1.5*(-x)^2, NA)和ifelse(x>=-2, 6*x-5, NA)后,第一段图形无法正确绘制,所有x值都返回-6,用标准plot函数也出现同样问题。
原因解析
核心错误是把比较运算符和赋值运算符搞混了:
- 在R中,
<-是赋值运算符,而<才是小于比较运算符。你写的x<-2不是判断"x是否小于-2",而是把数值-2赋值给变量x。 - 当
ifelse(x<-2, ...)执行时,整个条件表达式本质是赋值操作,返回值为被赋予的-2。在R的逻辑判断规则里,非零数值会被视为TRUE,因此ifelse会对所有输入的x执行第一个分支。 - 第一个分支的计算式
-1.5*(-x)^2中,x已经被赋值为-2,代入后得到-1.5*(-(-2))^2 = -1.5*(2)^2 = -6,所以所有输出结果都是-6。
修正方案
把条件里的赋值运算符<-改成比较运算符<(如果需要小于等于逻辑则保留<=,和最初的正确代码逻辑一致):
fun1 <- function(x){ ifelse(x < -2, -1.5*(-x)^2, NA) # 用<替代<- } fun2 <- function(x){ ifelse(x >= -2, 6*x-5, NA) } gg <- ggplot(data.frame(x = c(-5, 5)), aes(x = x))+ stat_function(fun = fun1, n=1001)+ stat_function(fun = fun2, n=1001) print(gg)
内容的提问来源于stack exchange,提问作者Blaszard
相关产品推荐
相关产品推荐

