在R中的一个2D图中绘制两个函数

时间:2017-09-06 10:28:03

标签: r plot ggplot2

我有以下功能(例如):

f<-function(x,a,b) a*sinh(x/b)

其中x是-L到L的实数 此外,a和b分别从a1到a2和从b1到b2离散地递增。 (例如,循环一些步骤)

我想知道如何绘制f_max(最多f为-L&lt; x&lt; L)和f_avg(f超过-L&lt的平均值) ; {&lt; L}与ab也在变化的同一图中。我正在寻找这样的事情:

enter image description here

如果我的问题中遗漏了任何内容,请根据需要做出任何假设(不要求)。无论如何它应该有所帮助,因为我的问题很普遍。

您可能会注意到我正在尝试在一个2D图形中可视化2个不同的3D图形(f_max vs a vs b)和(f_avg vs a vs b)。 ggplot2加上着色和线性曲线拟合非常受欢迎。

1 个答案:

答案 0 :(得分:1)

正如评论所示,您需要先创建一个值网格,但此类任务不需要optimintegrate个建议。

grid.xab <- expand.grid(a = c(4,5,6), 
                        b = c(1,1.5,2), 
                        x = seq(-2, 3, length.out = 50))
    a   b  x
  1 4 1.0 -2
  2 5 1.0 -2
  3 6 1.0 -2
  4 4 1.5 -2
  5 5 1.5 -2
  6 6 1.5 -2
         ...
445 4 1.5  3
446 5 1.5  3
447 6 1.5  3
448 4 2.0  3
449 5 2.0  3
450 6 2.0  3

您会看到, a b 值的所有可能组合都包含 x 值的范围。根据您需要的精度,您可以更改length.out =。现在,您可以在每个点评估 f x )。

library(dplyr)
library(ggplot2)

grid.xabf <- grid.xab %>% mutate(fx = a*sinh(x/b)) 
  a   b  x         fx
  1 4 1.0 -2 -14.507442
  2 5 1.0 -2 -18.134302
  3 6 1.0 -2 -21.761162
  4 4 1.5 -2  -7.060142
  5 5 1.5 -2  -8.825177
  6 6 1.5 -2 -10.590212
                    ...
445 4 1.5  3  14.507442
446 5 1.5  3  18.134302
447 6 1.5  3  21.761162
448 4 2.0  3   8.517118
449 5 2.0  3  10.646397
450 6 2.0  3  12.775677

你可以看到这个:

ggplot(grid.xabf, aes(x, fx)) + 
  geom_line(aes(color = factor(a), linetype = factor(b)))

enter image description here

现在我们只需要折叠所有 x 值,以获得每个 f ( x )的最大值和平均值> a 和 b

f.hat <- grid.xabf %>% 
  group_by(a, b) %>% 
  summarise(fmax = max(fx), favg = mean(fx))
# A tibble: 9 x 4
# Groups:   a [?]
      a     b      fmax     favg
  <dbl> <dbl>     <dbl>    <dbl>
1     4   1.0 40.071500 5.203415
2     4   1.5 14.507442 2.113929
3     4   2.0  8.517118 1.307466
4     5   1.0 50.089375 6.504269
5     5   1.5 18.134302 2.642412
6     5   2.0 10.646397 1.634333
7     6   1.0 60.107250 7.805122
8     6   1.5 21.761162 3.170894
9     6   2.0 12.775677 1.961199

现在我们终于可以制作你想要的数字了:

p1 <- ggplot(f.hat) + 
  geom_line(aes(a, fmax, color = factor(b), linetype = "f(x) max")) +
  geom_line(aes(a, favg, color = factor(b), linetype = "f(x) avg")) +
  geom_point(aes(a, fmax, color = factor(b)), shape = 16) +
  geom_point(aes(a, favg, color = factor(b)), shape = 1)

p1

enter image description here

但我们也可以让它更好一些:

p1 + 
scale_linetype_manual(values = c("f(x) max" = "solid",
                                   "f(x) avg" = "dashed"),
                        labels = c("f(x) max" = expression(bold(max)~italic(f)(x)), 
                                   "f(x) avg" = expression(bar(italic(f)(x)))),
                        name = expression(widehat(italic(f)(x)))) +
  labs(y = expression(widehat(italic(f)[-2]^3*(x))),
       color = "b",
       title = expression(italic(f)(x)==a%.%bold(sinh)*bgroup("(",frac(x, b),")")))

enter image description here