philsf
philsf

Reputation: 242

How to correctly represent both hline and abline in a legend in ggplot2?

I am trying to create a legend in ggplot2 for hlines and ablines using clues from other similar questions. I am close to getting what I need with the following code (and example image) but I can't seem to get rid of the extra lines crossing the legend icons.

p <- ggplot(mtcars, aes(x = wt, y=mpg, col = factor(cyl))) + geom_point()
p + geom_hline(aes(lty="foo",yintercept=20)) +
  geom_hline(aes(lty="bar",yintercept=25)) +
  geom_hline(aes(lty="bar",yintercept=30)) +
  geom_abline(aes(lty = "regression", intercept = 10 , slope = 1)) +
  scale_linetype_manual(name="",values=c(2,3,1))

enter image description here

This behavior in the legend only appears when I include the abline. Without it, both hline appear as intended in the legend.

What am I missing here?

As a secondary point: both hlines (labelled "bar" here) here use the exact same configuration, but have different values for yintercept. I wasn't able to draw both of them with the same command, receiving an error (Error: Aesthetics must be either length 1 or the same as the data (32): linetype, yintercept).

Whenever I copy&paste a command like this, it feels like I'm not doing it right. Is it possible to set two yintercepts, while manually defining the linetype to create a legend?

Upvotes: 1

Views: 733

Answers (1)

Marcelo
Marcelo

Reputation: 4282

You can use argument show.legend in the geom_abline:

ggplot() +
  geom_point(aes(x = mtcars$wt, y=mtcars$mpg, col = factor(mtcars$cyl))) +
  geom_hline(aes(lty=c("foo", "bar","bar"),yintercept=c(20,25,30))) +
  geom_abline(aes(lty = "regression", intercept = 10 , slope = 1), show.legend = F) +
  scale_linetype_manual(name="",values=c(2,3,1) )

If you not define the data on the ggplot command you can define all the hlines in just one command:

ggplot(mtcars, aes(x = wt, y=mpg, col = factor(cyl))) + geom_point() +
 geom_hline(aes(lty="foo",yintercept=20)) +
  geom_hline(aes(lty="bar",yintercept=25)) +
  geom_hline(aes(lty="bar",yintercept=30)) +
  geom_abline(aes(lty = "regression", intercept = 10 , slope = 1), show.legend = F) +
  scale_linetype_manual(name="",values=c(2,3,1) )

Upvotes: 2

Related Questions