The `geom_function`

can be used to draw functions in ggplot2. In this scenario you don’t need to pass a data frame to `ggplot`

, but to specify the axis limits with `xlim`

and the function to be plotted.

`# install.packages("ggplot2")`

library(ggplot2)

```
```

`ggplot() +`

xlim(c(0, 5)) +

geom_function(fun = cos)

Line customization

The function drawn can be customized with the typical arguments, such as `color`

, `lwd`

and `linetype`

for the color, line width and line type, respectively.

`# install.packages("ggplot2")`

library(ggplot2)

```
```

`ggplot() +`

xlim(c(0, 5)) +

geom_function(fun = cos,

colour = "red",

lwd = 1,

linetype = 1)

stat_function

You can also use `stat_function`

instead of `geom_function`

. In this scenario you can change the default geom, as shown in the example below.

`# install.packages("ggplot2")`

library(ggplot2)

```
```

`ggplot() +`

xlim(c(0, 5)) +

stat_function(fun = cos,

geom = "point")

Additional arguments

Note that if the function you are plotting has additional arguments you can pass them through a list with the `args`

argument. In the following example we are plotting a bessel function with `besselJ`

, which requires an argument named `nu`

.

`# install.packages("ggplot2")`

library(ggplot2)

```
```

`ggplot() +`

xlim(c(0, 50)) +

geom_function(fun = besselJ,

args = list(nu = 2))

Number of points

It should be noted that the number of points used to draw the function might not be enough, as in the previous example. To create a smoother function you can increase the value of the argument `n`

.

`# install.packages("ggplot2")`

library(ggplot2)

```
```

`ggplot() +`

xlim(c(0, 50)) +

geom_function(fun = besselJ,

n = 400,

args = list(nu = 2))

Overlay over existing plot

If you have created a plot you can add a function over it with `geom_function`

. The following example overlays the theoretical normal distribution over a normal distribution generated with 200 samples.

`# install.packages("ggplot2")`

library(ggplot2)

```
```set.seed(1)

df <- data.frame(x = rnorm(200))

`ggplot(df, aes(x = x)) +`

geom_density() +

geom_function(fun = dnorm, colour = "red")

Adding several functions

Finally, it is worth to mention that you can add several functions to the same plot, adding more layers.

`# install.packages("ggplot2")`

library(ggplot2)

```
```

`ggplot() +`

xlim(c(0, 50)) +

geom_function(fun = besselJ, n = 400,

aes(color = "BJ 0"),

args = list(nu = 0)) +

geom_function(fun = besselJ, n = 400,

aes(color = "BJ 2"),

args = list(nu = 2)) +

guides(colour = guide_legend(title = ""))

See also