拨开荷叶行,寻梦已然成。仙女莲花里,翩翩白鹭情。
IMG-LOGO
主页 文章列表 ggplot中的函式图错误地显示为恒定线

ggplot中的函式图错误地显示为恒定线

白鹭 - 2022-03-01 2092 0 0

我想用给定的系数绘制高次多项式函式。我创建该函式f_erzeuger()是为了撰写一个多项式函式f,以便能够使用 ggplot2 和stat_function(fun = f). coef是多项式函式的系数矢量。

f_erzeuger <- function(coef) {
  f <- function(x) {
    x_vec <- c(1, x, x^2, x^3, x^4, x^5, x^6, x^7, x^8, x^9, x^10)
    d <- length(coef) - 1 # degree of the polynomial
    sum(coef * x_vec[1:(d 1)])
  }
  f
} 

但是 ggplot2 无法绘制此曲线,可能是因为该函式实际上并未计算函式项。

f <- f_erzeuger(c(4, 5, 2))
ggplot(data.frame(x = c(-50, 50)), aes(x = x))  
  stat_function(fun = f, color = "blue")  
  stat_function(fun = function(x){3   5*x   2*x^2}, color = "red")

f 即使它应该是多项式,也显示为一条恒定线。

ggplot 中的函式图错误地显示为恒定线

uj5u.com热心网友回复:

问题是你的函式没有矢量化。运行?stat_function并查看以下档案fun

为了使函式矢量化,我们需要确保,例如,f(c(0, 1))将回传c(f(0), f(1))请注意,您的函式中的一个问题是您定义的行x_vec = c(1, x, ...)如果x是一个包含多个元素的矢量,这将不起作用

有很多方法可以矢量化您的函式。我将使用 tidyverse(主要是purrr::map()来做到这一点

f_erzeuger = function(coef) {
  function(xvals) {
    d = length(coef)
    map_dbl(xvals, function(x) {
      x_vec = x ^ (0:(d - 1))
      sum(coef * x_vec)
    })
  }
}

对此功能所做的更改:

  • 最重要的是,该函式现在已矢量化。
  • x_vec我们可以利用^R 中的矢量化(因此x^(0:2)与 相同c(1, x, x^2)这一事实,而不是明确定义为 10
  • 我们可以直接在内部回传函式,f_erzeuger()而不是定义f然后回传它。

现在事情将按预期作业:

f <- f_erzeuger(c(4, 5, 2))
ggplot(data.frame(x = c(-50, 50)), aes(x = x))  
  stat_function(fun = f, color = "blue")  
  stat_function(fun = function(x){3   5*x   2*x^2}, color = "red")

ggplot 中的函式图错误地显示为恒定线

uj5u.com热心网友回复:

试试curve

f <- f_erzeuger(c(4, 5, 2))
curve(Vectorize(f)(x), -50, 50, col='#c55d0d')

ggplot 中的函式图错误地显示为恒定线

标签:

0 评论

发表评论

您的电子邮件地址不会被公开。 必填的字段已做标记 *