6

I try to add a geom_ribbon object to my ggplot2 plot. In my data frame, I have NA values that (I guess) may cause a problem. This is a reproducible example of the data frame I have:

base <- c(1:10, rep(NA, 10))
output1 <- c(rep(NA, 9), 10 - 0:10)
output2 <- c(rep(NA, 9), 10 + 0:10)
xaxis <- 1:20

df <- data.frame(xaxis, base, output1, output2)
df

     xaxis base output1 output2
  1      1    1      NA      NA
  2      2    2      NA      NA
  3      3    3      NA      NA
  4      4    4      NA      NA
  5      5    5      NA      NA
  6      6    6      NA      NA
  7      7    7      NA      NA
  8      8    8      NA      NA
  9      9    9      NA      NA
  10    10   10      10      10
  11    11   NA       9      11
  12    12   NA       8      12
  13    13   NA       7      13
  14    14   NA       6      14
  15    15   NA       5      15
  16    16   NA       4      16
  17    17   NA       3      17
  18    18   NA       2      18
  19    19   NA       1      19
  20    20   NA       0      20

And my attempt to plot a ggplot2 object with a geom_ribbon:

  dfm <- melt(df, id=1)
  ggplot(dfm, aes(x = xaxis, y = value, colour = variable)) + 
    geom_line(aes(group=variable)) + 
    geom_ribbon(data=df, aes(group = 1, ymin=output1, ymax=output2))

And, eventually, I got an error I cannot deal with:

Error in eval(expr, envir, enclos) : object 'variable' not found

Thank you in advance for any suggestions.

micstr
  • 5,080
  • 8
  • 48
  • 76
Marta Karas
  • 4,967
  • 10
  • 47
  • 77

2 Answers2

16

You got this error because variable is used for color in aes() of function ggplot(). When you add geom_ribbon() with new data frame geom_ribbon() tries to find variable in new data frame to use it for colors. To ignore this variable add inherit.aes=FALSE inside geom_ribbon() - so you are telling that all parameters should be taken independently - that's way you should set x=xaxis again in geom_ribbon().

ggplot(dfm, aes(x = xaxis, y = value, colour = variable)) + 
  geom_line(aes(group=variable)) + 
  geom_ribbon(data=df, aes(group = 1, x = xaxis,ymin=output1, ymax=output2),
                       inherit.aes=FALSE)
Didzis Elferts
  • 95,661
  • 14
  • 264
  • 201
  • 1
    Very useful, although a problem remains that the legend can get mixed up. See `d = data.frame(x = sample(-50:50,20), y = sample(-50:50,20), size = sample(1:10,20,rep=T)); rads = function(deg) return(pi * deg / 180); poly = data.frame(x = 40*sin(rads(1:360)), y = 40*cos(rads(1:360))); ggplot(d, aes(x, y, size=size)) + geom_point() + geom_polygon(data=poly, aes(x, y), fill=NA, col='black', inherit.aes=F)` – geotheory Sep 08 '14 at 11:32
  • @geotheory Yes in this case it makes problem, but you can move `size=size` to `aes()` of `geom_point()` or set for example `size=1` in `geom_polygon()` (outside `aes()`) – Didzis Elferts Sep 08 '14 at 11:37
2

The definition for color = variable is being carried over from the original ggplot layer. Override it in the call to geom_ribbon to make it work: geom_ribbon(data = df, aes(group = 1, ymin=output1, ymax=output2, color=I('red')).

musically_ut
  • 34,028
  • 8
  • 94
  • 106