200

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

8 Answers 8

249

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

4
  • 6
    Setting show.legend to FALSE in ggplot2 3.2.1 will remove the legend altogether!
    – NelsonGon
    Commented Sep 8, 2019 at 14:11
  • 2
    (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
    Commented May 10, 2022 at 18:16
  • This does not seem to work when the aes() part is included inside geom.txt and returns "Ignoring unknown aesthetics: show.legend"
    – Markm0705
    Commented Sep 1, 2023 at 0:50
  • 1
    @Markm0705 that sounds like you put show.legend = FALSE inside aes(). It should be inside geom_text(), but not inside aes(). So geom_text(aes(label = Species), show.legend = FALSE) is good, geom_text(aes(label = Species, show.legend = FALSE)) is bad. Commented Jan 4 at 3:14
35

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)

2
  • 3
    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
    Commented May 30, 2020 at 15:33
  • In case that color is used instead of fill it could be guides( color = guide_legend(override.aes = aes(label = ""))) Commented Jul 13, 2023 at 16:27
18

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) +
..
1
  • 1
    This worked for me, but show_guide is now deprecated. Use show.legend instead. Commented May 27, 2022 at 3:18
8

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

1
  • 3
    Is there any way to customize the 'a' to something else like 'r'?
    – asalimih
    Commented Apr 29, 2020 at 22:45
5

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!

3

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

Building off the top answer. If you only wanted the geom_text() to be visible but have that geom_point() for the purposes of your legend you could set the alpha to 0 making it invisible but override it to 1 in the guides to force it to show.

ggplot(data = iris, aes(x = Sepal.Length, y=Sepal.Width, 
                        shape = Species, colour = Species)) + 
  geom_point(alpha = 0) + 
  geom_text(aes(label = Species)) +
  guides(color = guide_legend(override.aes = aes(label = "", alpha = 1))) 

enter image description here

0

In case it helps, even I'm nob.

stat_cor() also needs show.legend=FALSE to avoid "a".

Wasted time for me... ;)

Many thanks for all your contributions

Not the answer you're looking for? Browse other questions tagged or ask your own question.