简体   繁体   中英

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

在此处输入图片说明

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?

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM