Nikita Yatchenko
Nikita Yatchenko

Reputation: 13

Warning message 'mapping' is not used by stat_function() in R

While completing a project for understanding central limit theorem for exponential distribution, I ran into an annoying error message when plotting simulated vs theoretical distributions. When I run the code below, I get an error: 'mapping' is not used by stat_function().

By mapping I assume the error is referring to the aes parameter, which I later map to color red using scale_color_manual in order to show it in a legend.

My question is two-fold: why is this error happening? and is there a more efficient way to create a legend without using scale_color_manual?

Thank you!

lambda <- 0.2
n_sims <- 1000
set.seed(100100)
total_exp <- rexp(40 * n_sims, rate = lambda)
exp_data <- data.frame(
        Mean = apply(matrix(total_exp, n_sims), 1, mean),
        Vars = apply(matrix(total_exp, n_sims), 1, var)
)

g <- ggplot(data = exp_data, aes(x = Mean))
g + 
        geom_histogram(binwidth = .3, color = 'black', aes(y=..density..), fill = 'steelblue') +
        geom_density(size=.5, aes(color = 'Simulation'))+
        stat_function(fun = dnorm, mapping = aes(color='Theoretical'), args = list(mean = 1/lambda, sd = 1/lambda/sqrt(40)), size=.5, inherit.aes = F, show.legend = T)+
        geom_text(x = 5.6, y = 0.1, label = "Theoretical and Sample Mean", size = 2, color = 'red') +
        scale_color_manual("Legend", values = c('Theoretical' = 'red', 'Simulation' = 'blue')) +
        geom_vline(aes(xintercept = 1/lambda), lwd = 1.5, color = 'grey') +
        labs(x = 'Exponential Distribution Simulations Average Values') +
        ggtitle('Sample Mean vs Theoretical Mean of the Averages of the Exponential Distribution')+
        theme_classic(base_size = 10)

Upvotes: 1

Views: 573

Answers (2)

Claus Wilke
Claus Wilke

Reputation: 17790

It's not an error, it's a warning:

library(ggplot2)

lambda <- 0.2
n_sims <- 1000
set.seed(100100)
total_exp <- rexp(40 * n_sims, rate = lambda)
exp_data <- data.frame(
  Mean = apply(matrix(total_exp, n_sims), 1, mean),
  Vars = apply(matrix(total_exp, n_sims), 1, var)
)

g <- ggplot(data = exp_data, aes(x = Mean))
g + 
  geom_histogram(binwidth = .3, color = 'black', aes(y=..density..), fill = 'steelblue') +
  geom_density(size=.5, aes(color = 'Simulation'))+
  stat_function(fun = dnorm, mapping = aes(color='Theoretical'), args = list(mean = 1/lambda, sd = 1/lambda/sqrt(40)), size=.5, inherit.aes = F, show.legend = T)+
  geom_text(x = 5.6, y = 0.1, label = "Theoretical and Sample Mean", size = 2, color = 'red') +
  scale_color_manual("Legend", values = c('Theoretical' = 'red', 'Simulation' = 'blue')) +
  geom_vline(aes(xintercept = 1/lambda), lwd = 1.5, color = 'grey') +
  labs(x = 'Exponential Distribution Simulations Average Values') +
  ggtitle('Sample Mean vs Theoretical Mean of the Averages of the Exponential Distribution')+
  theme_classic(base_size = 10)
#> Warning: `mapping` is not used by stat_function()

Created on 2020-05-01 by the reprex package (v0.3.0)

You can suppress the warning by calling geom_line(stat = "function") rather than stat_function():

library(ggplot2)

lambda <- 0.2
n_sims <- 1000
set.seed(100100)
total_exp <- rexp(40 * n_sims, rate = lambda)
exp_data <- data.frame(
  Mean = apply(matrix(total_exp, n_sims), 1, mean),
  Vars = apply(matrix(total_exp, n_sims), 1, var)
)

g <- ggplot(data = exp_data, aes(x = Mean))
g + 
  geom_histogram(binwidth = .3, color = 'black', aes(y=..density..), fill = 'steelblue') +
  geom_density(size=.5, aes(color = 'Simulation'))+
  geom_line(stat = "function", fun = dnorm, mapping = aes(color='Theoretical'), args = list(mean = 1/lambda, sd = 1/lambda/sqrt(40)), size=.5, inherit.aes = F, show.legend = T)+
  geom_text(x = 5.6, y = 0.1, label = "Theoretical and Sample Mean", size = 2, color = 'red') +
  scale_color_manual("Legend", values = c('Theoretical' = 'red', 'Simulation' = 'blue')) +
  geom_vline(aes(xintercept = 1/lambda), lwd = 1.5, color = 'grey') +
  labs(x = 'Exponential Distribution Simulations Average Values') +
  ggtitle('Sample Mean vs Theoretical Mean of the Averages of the Exponential Distribution')+
  theme_classic(base_size = 10)

Created on 2020-05-01 by the reprex package (v0.3.0)

In my opinion, the warning is erroneous, and an issue has been filed about this problem: https://github.com/tidyverse/ggplot2/issues/3611 However, it's not that easy to solve, and therefore as of now the warning is there.

Upvotes: 2

Mark K
Mark K

Reputation: 199

  1. I'm unable to recreate your issue -- when I run your code a plot is generated (below), which suggests the issue is likely to do you with your environment. A general 'solution' is to clear your workspace using the menu dropdown or similar: Session -> Clear workspace..., then re-run your code.

  2. For refactoring the color issue, you can simplify scale_color_manual to scale_color_manual("Legend", values = c('blue','red')), but how it is now, is a bit better in my view. Anything beyond that has more to do with changing the data structure and mapping.

Apologies, I don't have the rep to make a comment.

plot produced by your code

Upvotes: 1

Related Questions