170

How can I can remove the letter 'a' from the legend generated by this code? If I remove the geom_text, then the 'a' letter will not show in the legend. I want to keep geom_text, though.

ggplot(data = iris, aes(x = Sepal.Length, y=Sepal.Width, 
                        shape = Species, colour = Species)) + 
   geom_point() + 
   geom_text(aes(label = Species))
Henrik
  • 61,039
  • 13
  • 131
  • 152
user2700207
  • 1,743
  • 2
  • 11
  • 4

6 Answers6

204

Set show.legend = FALSE in geom_text:

ggplot(data = iris,
       aes(x = Sepal.Length, y = Sepal.Width, colour = Species,
           shape = Species, label = Species)) + 
    geom_point() +
    geom_text(show.legend = FALSE)

The argument show_guide changed name to show.legend in ggplot2 2.0.0 (see release news).


Pre-ggplot2 2.0.0:

With show_guide = FALSE like so...

ggplot(data = iris, aes(x = Sepal.Length, y = Sepal.Width , colour = Species,
                        shape = Species, label = Species ), size = 20) + 
geom_point() +
geom_text(show_guide  = FALSE)

enter image description here

Captain Hat
  • 1,535
  • 10
  • 23
Simon O'Hanlon
  • 56,833
  • 13
  • 136
  • 180
  • 6
    Setting `show.legend` to `FALSE` in `ggplot2` 3.2.1 will remove the legend altogether! – NelsonGon Sep 08 '19 at 14:11
  • (a) in `ggplot2` 3.3.5 `show.legend=FALSE` preserves the overall legend and (b) I am surprised at how difficult finding this was – learner May 10 '22 at 18:16
21

We can use guide_legend(override.aes = aes(...)) to hide the 'a' in the legend.

Below is a short example of how you might use guide_legend()

library(ggrepel)
#> Loading required package: ggplot2

d <- mtcars[c(1:8),]

p <- ggplot(d, aes(wt, mpg)) +
  geom_point() +
  theme_classic(base_size = 18) +
  geom_label_repel(
    aes(label = rownames(d), fill = factor(cyl)),
    size = 5, color = "white"
  )

# Let's see what the default legend looks like.
p

# Now let's override some of the aesthetics:
p + guides(
  fill = guide_legend(
    title = "Legend Title",
    override.aes = aes(label = "")
  )
)

Created on 2019-04-29 by the reprex package (v0.2.1)

Kamil Slowikowski
  • 3,619
  • 3
  • 29
  • 38
  • 1
    I think this is a better solution than the accepted one, as it allows to specifically remove the 'a' letter from the legend, while other aesthetics can, if desired, remain untouched. – Markel May 30 '20 at 15:33
17

I had a similar problem. Simon's solution worked for me but a slight twist was required. I did not realise that I need to add "show_guide = F" to geom_text's arguments, rather than replace with it the existing arguments - which is what Simon's solution shows. For a ggplot2 noob like me this was not that obvious. A proper example would have used the OP's code and just added the missing argument like this:

..
geom_text(aes(label=Species), show_guide = F) +
..
Community
  • 1
  • 1
Nick stands with Ukraine
  • 2,634
  • 2
  • 32
  • 39
9

Like Nick said

the following code would still produce the error:

geom_text(aes(x=1,y=2,label="",show_guide=F))

enter image description here

whereas:

geom_text(aes(x=1,y=2,label=""),show_guide=F)

outside the aes argument eliminates the a over the legend

enter image description here

Timo Kvamme
  • 2,416
  • 1
  • 17
  • 23
4

You can also use show.legend = FALSE in the arguments of geom_label_repel() to remove the "a" in the legend. So, instead of

ggplot(d, aes(wt, mpg)) +
  geom_point() +
  theme_classic(base_size = 18) +
  geom_label_repel(
    aes(label = rownames(d), fill = factor(cyl)),
    size = 5, color = "white"
  )+ guides(
  fill = guide_legend(
    title = "Legend Title",
    override.aes = aes(label = "")
  )
)

you can do,

ggplot(d, aes(wt, mpg)) +
  geom_point() +
  theme_classic(base_size = 18) +
  geom_label_repel(
    aes(label = rownames(d), fill = factor(cyl)),
    size = 5, color = "white",
    show.legend = FALSE  )
3

I had a similar problem, with an 'a' appearing behind different coloured points I was trying to label with geom_text_repel. To remove the 'a', so that it would just show the point without the 'a' behind it, I had to add show.legend=FALSE as an argument in geom_text_repel.

Hope that makes sense to anyone who might be labouring with the same issue!

arranjdavis
  • 549
  • 4
  • 12