datakritter
datakritter

Reputation: 600

Hide legend for a single geom in ggplot2

I map the same variable (color) to color in two different geoms. I want them either to appear in separate legends (DHJ and EFI) or preferably just skip the second legend (for E, F, and I) altogether. Currently, R mixes the two together and gives me a legend that lists DEFHIJ in alphabetical order all mixed together.

Basically, I want to graph today's points onto some smoothed lines that use a standard dataset. I don't want there to be a legend for the smoothed lines - we are all familiar with them and they are standard on all our graphs. I just want a legend for the points only.

I've tried show.legend = FALSE as suggested elsewhere, but that doesn't seem to have an effect. guides(color = FALSE) removes the entire legend.

Reprex:

library(tidyverse)

set1 <- diamonds %>%
  filter(color %in% c("D", "H", "J")) 

set2 <- diamonds %>%
  filter(color %in% c("E", "F", "I")) 

ggplot() +
  geom_point(data = set1, 
             aes(x = x, y = y, color = color)) +
  geom_smooth(data = set2, 
              show.legend = FALSE, 
              aes(x = x, y = y, color = color))

Here is the graph that is produced. It has all 6 letters in the legend, instead of only DHJ. enter image description here

Upvotes: 2

Views: 1368

Answers (1)

aosmith
aosmith

Reputation: 36084

If you want the legend to show only the colors from one dataset you can do so by setting the breaks in scale_color_discrete() to those values.

... +
     scale_color_discrete(breaks = unique(set1$color) )

If you aren't using the colors of the lines, since this is standard background info, you could add the lines by using group ingeom_smooth() instead of color. (Also see linetype if you wanted to be able to tell the lines apart.)

ggplot() +
     geom_point(data = set1, 
                aes(x = x, y = y, color = color)) +
     geom_smooth(data = set2, 
                 aes(x = x, y = y, group = color)) 

Upvotes: 2

Related Questions