These are used to compute and draw a function as a continuous curve. For example - a standard normal curve can be drawn from the dnorm() function -

> library(ggplot2)
> ggplot() + 
+   xlim(-3, 3) + 
+   stat_function(fun = dnorm, geom = "polygon", fill = "#44adb7", color = "#1a4145") + 
+   theme_bw() + labs(title = "Standard Normal Curve")

To specify arguments of the function, use args -

> ggplot() + 
+   xlim(25, 55) + 
+   stat_function(fun = dnorm, args = list(mean = 40, sd = 3),
+                 geom = "polygon", fill = "#44adb7", color = "#1a4145") + 
+   theme_bw() + labs(title = "Normal Curve")

Adding multiple functions to the same plot -

> ggplot() + 
+   xlim(25, 65) + 
+   stat_function(fun = dnorm, args = list(mean = 40, sd = 3), 
+                 alpha = 0.5, aes(color = "Mean 40"),
+                 geom = "polygon", fill = "#44adb7", color = "#1a4145") + 
+   stat_function(fun = dnorm, args = list(mean = 50, sd = 3), 
+                 alpha = 0.5, aes(color = "Mean 50"),
+                 geom = "polygon", fill = "#04fda4", color = "#1a4145") + 
+   theme_bw() + labs(title = "Normal Curves")

Using geom_function() -

> ggplot() + 
+   xlim (-4, 4) +
+   geom_function(fun = dnorm, aes(colour = "Normal")) +
+   geom_function(fun = dt, args = list(df = 7), aes(colour = "t, df = 7")) +
+   theme_bw() + labs(title = "Normal and t Distribution", color=NULL) 

> ggplot() + 
+   xlim(25, 65) + 
+   geom_function(fun = dnorm, args = list(mean = 40, sd = 3), 
+                 aes(color = "Mean = 40")) + 
+   geom_function(fun = dnorm, args = list(mean = 50, sd = 3), 
+                 aes(color = "Mean = 50")) + 
+   theme_bw() + labs(title = "Normal Curves", color=NULL) 

Overlay a function over a plot -

> ggplot(data.frame(x = rnorm(100)), aes(x)) +
+   geom_density() +
+   geom_function(fun = dnorm, colour = "red") +
+   xlim(-4, 4)

Using a custom function -

> sigmoid <- function(x){ 1/(1+exp(-x)) }
> ggplot() +        
+   xlim(-10, 10) + 
+   stat_function(fun = sigmoid) +  # adding function
+   theme_bw() + labs(title = "Sigmoid Curve")

Another way to pass a custom function -

> ggplot() +        
+   xlim(-10, 10) + 
+   stat_function(fun = ~ 1/(1+exp(-.x)) ) + # Another way to specify the function
+   theme_bw() + labs(title = "Sigmoid Curve")

LS0tDQp0aXRsZTogIlVzaW5nIHN0YXRfZnVuY3Rpb24oKSBhbmQgZ2VvbV9mdW5jdGlvbigpIg0KYXV0aG9yOiAiTUQgQUhTQU5VTCBJU0xBTSINCm91dHB1dDogDQogIGh0bWxfZG9jdW1lbnQ6DQogICAgdG9jOiB0cnVlDQogICAgdG9jX2Zsb2F0OiB0cnVlDQogICAgdG9jX2RlcHRoOiA0DQogICAgdGhlbWU6IGNlcnVsZWFuDQogICAgY29kZV9kb3dubG9hZDogdHJ1ZQ0KLS0tDQoNCmBgYHtyLCBpbmNsdWRlPUZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KA0KICBjb21tZW50ID0gIiMjIiwgcHJvbXB0ID0gVFJVRSwgIHdhcm5pbmc9RkFMU0UNCikNCmBgYA0KDQotLS0NCg0KVGhlc2UgYXJlIHVzZWQgdG8gY29tcHV0ZSBhbmQgZHJhdyBhIGZ1bmN0aW9uIGFzIGEgY29udGludW91cyBjdXJ2ZS4gRm9yIGV4YW1wbGUgLSBhIHN0YW5kYXJkIG5vcm1hbCBjdXJ2ZSBjYW4gYmUgZHJhd24gZnJvbSB0aGUgYGRub3JtKClgIGZ1bmN0aW9uIC0gDQpgYGB7cn0NCmxpYnJhcnkoZ2dwbG90MikNCmdncGxvdCgpICsgDQogIHhsaW0oLTMsIDMpICsgDQogIHN0YXRfZnVuY3Rpb24oZnVuID0gZG5vcm0sIGdlb20gPSAicG9seWdvbiIsIGZpbGwgPSAiIzQ0YWRiNyIsIGNvbG9yID0gIiMxYTQxNDUiKSArIA0KICB0aGVtZV9idygpICsgbGFicyh0aXRsZSA9ICJTdGFuZGFyZCBOb3JtYWwgQ3VydmUiKQ0KYGBgDQoNClRvIHNwZWNpZnkgYXJndW1lbnRzIG9mIHRoZSBmdW5jdGlvbiwgdXNlIGBhcmdzYCAtIA0KYGBge3J9DQpnZ3Bsb3QoKSArIA0KICB4bGltKDI1LCA1NSkgKyANCiAgc3RhdF9mdW5jdGlvbihmdW4gPSBkbm9ybSwgYXJncyA9IGxpc3QobWVhbiA9IDQwLCBzZCA9IDMpLA0KICAgICAgICAgICAgICAgIGdlb20gPSAicG9seWdvbiIsIGZpbGwgPSAiIzQ0YWRiNyIsIGNvbG9yID0gIiMxYTQxNDUiKSArIA0KICB0aGVtZV9idygpICsgbGFicyh0aXRsZSA9ICJOb3JtYWwgQ3VydmUiKQ0KYGBgDQoNCkFkZGluZyBtdWx0aXBsZSBmdW5jdGlvbnMgdG8gdGhlIHNhbWUgcGxvdCAtDQpgYGB7cn0NCmdncGxvdCgpICsgDQogIHhsaW0oMjUsIDY1KSArIA0KICBzdGF0X2Z1bmN0aW9uKGZ1biA9IGRub3JtLCBhcmdzID0gbGlzdChtZWFuID0gNDAsIHNkID0gMyksIA0KICAgICAgICAgICAgICAgIGFscGhhID0gMC41LCBhZXMoY29sb3IgPSAiTWVhbiA0MCIpLA0KICAgICAgICAgICAgICAgIGdlb20gPSAicG9seWdvbiIsIGZpbGwgPSAiIzQ0YWRiNyIsIGNvbG9yID0gIiMxYTQxNDUiKSArIA0KICBzdGF0X2Z1bmN0aW9uKGZ1biA9IGRub3JtLCBhcmdzID0gbGlzdChtZWFuID0gNTAsIHNkID0gMyksIA0KICAgICAgICAgICAgICAgIGFscGhhID0gMC41LCBhZXMoY29sb3IgPSAiTWVhbiA1MCIpLA0KICAgICAgICAgICAgICAgIGdlb20gPSAicG9seWdvbiIsIGZpbGwgPSAiIzA0ZmRhNCIsIGNvbG9yID0gIiMxYTQxNDUiKSArIA0KICB0aGVtZV9idygpICsgbGFicyh0aXRsZSA9ICJOb3JtYWwgQ3VydmVzIikNCmBgYA0KDQpVc2luZyBnZW9tX2Z1bmN0aW9uKCkgLQ0KYGBge3J9DQpnZ3Bsb3QoKSArIA0KICB4bGltICgtNCwgNCkgKw0KICBnZW9tX2Z1bmN0aW9uKGZ1biA9IGRub3JtLCBhZXMoY29sb3VyID0gIk5vcm1hbCIpKSArDQogIGdlb21fZnVuY3Rpb24oZnVuID0gZHQsIGFyZ3MgPSBsaXN0KGRmID0gNyksIGFlcyhjb2xvdXIgPSAidCwgZGYgPSA3IikpICsNCiAgdGhlbWVfYncoKSArIGxhYnModGl0bGUgPSAiTm9ybWFsIGFuZCB0IERpc3RyaWJ1dGlvbiIsIGNvbG9yPU5VTEwpIA0KYGBgDQoNCmBgYHtyfQ0KZ2dwbG90KCkgKyANCiAgeGxpbSgyNSwgNjUpICsgDQogIGdlb21fZnVuY3Rpb24oZnVuID0gZG5vcm0sIGFyZ3MgPSBsaXN0KG1lYW4gPSA0MCwgc2QgPSAzKSwgDQogICAgICAgICAgICAgICAgYWVzKGNvbG9yID0gIk1lYW4gPSA0MCIpKSArIA0KICBnZW9tX2Z1bmN0aW9uKGZ1biA9IGRub3JtLCBhcmdzID0gbGlzdChtZWFuID0gNTAsIHNkID0gMyksIA0KICAgICAgICAgICAgICAgIGFlcyhjb2xvciA9ICJNZWFuID0gNTAiKSkgKyANCiAgdGhlbWVfYncoKSArIGxhYnModGl0bGUgPSAiTm9ybWFsIEN1cnZlcyIsIGNvbG9yPU5VTEwpIA0KYGBgDQoNCk92ZXJsYXkgYSBmdW5jdGlvbiBvdmVyIGEgcGxvdCAtDQpgYGB7cn0NCmdncGxvdChkYXRhLmZyYW1lKHggPSBybm9ybSgxMDApKSwgYWVzKHgpKSArDQogIGdlb21fZGVuc2l0eSgpICsNCiAgZ2VvbV9mdW5jdGlvbihmdW4gPSBkbm9ybSwgY29sb3VyID0gInJlZCIpICsNCiAgeGxpbSgtNCwgNCkNCmBgYA0KDQpVc2luZyBhIGN1c3RvbSBmdW5jdGlvbiAtDQpgYGB7cn0NCnNpZ21vaWQgPC0gZnVuY3Rpb24oeCl7IDEvKDErZXhwKC14KSkgfQ0KZ2dwbG90KCkgKyAgICAgICAgDQogIHhsaW0oLTEwLCAxMCkgKyANCiAgc3RhdF9mdW5jdGlvbihmdW4gPSBzaWdtb2lkKSArICAjIGFkZGluZyBmdW5jdGlvbg0KICB0aGVtZV9idygpICsgbGFicyh0aXRsZSA9ICJTaWdtb2lkIEN1cnZlIikNCmBgYA0KDQpBbm90aGVyIHdheSB0byBwYXNzIGEgY3VzdG9tIGZ1bmN0aW9uIC0gDQpgYGB7cn0NCmdncGxvdCgpICsgICAgICAgIA0KICB4bGltKC0xMCwgMTApICsgDQogIHN0YXRfZnVuY3Rpb24oZnVuID0gfiAxLygxK2V4cCgtLngpKSApICsgIyBBbm90aGVyIHdheSB0byBzcGVjaWZ5IHRoZSBmdW5jdGlvbg0KICB0aGVtZV9idygpICsgbGFicyh0aXRsZSA9ICJTaWdtb2lkIEN1cnZlIikNCmBgYA0K