I've got a graph and I'd like to superimpose a functional form over the graph. Seems straight forward, but I'm missing something. Here's my example data and illustration where I use stat_function to try and add f1 to the graph:
library(ggplot2)
sample_data <- data.frame(rate = c(0.514492753623188, 0.553072625698324, 0.656527249683143, 0.675694939415538,
0.68681076312307, 0.715657311669128, 0.792349726775956),
level = c(0.55, 0.6, 0.65, 0.7, 0.75, 0.8, 0.85) )
f1 <- function(x) pbeta(x, shape1=1.01, shape2=.9 ) * 100
g <- ggplot() +
geom_line(aes(y = rate*100 , x = level),
data = sample_data, stat="identity") +
stat_function(fun = f1)
g

As you can see, the f1 line is not there.
So as an alternative, I can add the points to the initial data.frame and then plot them with geom_line as the following example illustrates:
## add f1 to data.frame
sample_data$f1 <- f1(sample_data$level )
g <- ggplot() +
geom_line(aes(y = rate*100 , x = level),
data = sample_data, stat="identity") +
geom_line(aes(y = f1 , x = level),
data = sample_data, stat="identity", color='red')
g

So that works, and gets me what I need, but I can't figure out why stat_function didn't work. Any tips?
This example explains how to draw a ggplot2 plot based on two different data sources. For this, we have to set the data argument within the ggplot function to be equal to NULL, and then we have to specify the two different data frames within two different calls of a geom_ function (in this case geom_point).
stat_function() computes the following variables: x. x values along a grid. y.
Elements that are normally added to a ggplot with operator + , such as scales, themes, aesthetics can be replaced with the %+% operator.
You need data = sample_data, aes(y = rate*100 , x = level) in your first ggplot call so stat_function knows about the data are being used
library(ggplot2)
sample_data <- data.frame(rate = c(0.514492753623188, 0.553072625698324, 0.656527249683143, 0.675694939415538,
0.68681076312307, 0.715657311669128, 0.792349726775956),
level = c(0.55, 0.6, 0.65, 0.7, 0.75, 0.8, 0.85) )
f1 <- function(x) pbeta(x, shape1=1.01, shape2=.9 ) * 100
g <- ggplot(data = sample_data, aes(y = rate*100 , x = level)) +
geom_line() +
stat_function(fun = f1, color = "red")
g

Created on 2018-05-20 by the reprex package (v0.2.0).
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With