6

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?

1 Answer 1

5

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).

Sign up to request clarification or add additional context in comments.

4 Comments

ohhh. I get it. Thank you, I didn't realize the implications of where I put my data= step.
You're welcome! Also you don't need stat="identity" in geom_line() either
that makes sense... I had originally been making some bar charts and the identity business sort of stuck to my code ;)
That was my guess as well :D

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.