Drew Steen
Drew Steen

Reputation: 16607

`geom_abline` and `facet_wrap` seem incompatible

I get errors when I use geom_abline in the same plot as facet_wrap or facet_grid, and I don't understand why. For example

# Example data
ex <- data.frame(x=1:10, y=1:10, f=gl(2, 5))

ggplot() + 
  geom_point(data=ex, aes(x=x, y=y)) +
  geom_abline(slope=1, intercept=0) + 
  facet_wrap(~f)

causes Error in if (empty(data)) { : missing value where TRUE/FALSE needed.

Above I set the data in the geom_point layer because later on I will add data from a different data frame. This has something to do with the problem, because when I set the data in the base layer I get a different error:

ggplot(ex, aes(x=x, y=y)) + 
  geom_abline(slope=1, intercept=0) +
  facet_wrap(~f)

Error in as.environment(where) : 'where' is missing

Workaround

There's an easy workaround: If I make a data frame to define a 1:1 line and plot it using geom_line I get essentially the same plot I would have gotten from geom_abline...

# Define a 1:1 line with data
one_to_one <- data.frame(xO=range(ex$totalcells), yO=range(ex$totalcells))

# Plot the 1:1 line with geom_line
ggplot() + 
  geom_point(data=ex, aes(x=x, y=y)) +
  geom_line(data=one_to_one, aes(x=xO, y=yO), colour="black") +
  facet_wrap(~f)

enter image description here

...so this question is more about why those errors arise (and whether they represent a bug or expected behavior) rather than how to work around the problem.

Upvotes: 3

Views: 3044

Answers (1)

Paul Hiemstra
Paul Hiemstra

Reputation: 60944

The following works:

ggplot(ex, aes(x=x, y=y)) + geom_point() + 
  geom_abline(slope=1, intercept=0) +
  facet_wrap(~f)

Note the additional geom_point() I added, based on your second example.

Upvotes: 2

Related Questions