How to extract the legend labels from a ggplot2 ob

2020-02-14 11:29发布

问题:

I am interested in automatically extracting the legend of ggplot2 object as a table (not as a graphics object). Let's illustrate with an example:

p <- ggplot(iris, aes(x=Sepal.Length, y= Petal.Length, color=Species)) +
       geom_point()
p

Now there is a previous question, which shows how one can extract the colours used in the plot:

 g <- ggplot_build(p)
 unique(g$data[[1]]["colour"])

      colour
 1   #F8766D
 51  #00BA38
 101 #619CFF

But I am also interested in the labels which those colours correspond to in the legend, i.e. the final result I would be interested in is the following table:

colour    label
#F8766D   setosa
#00BA38   versicolor
#619CFF   virginica

回答1:

Something like this maybe:

#get the colours as mentioned in your question
#and you could get the levels from the plot's data
data.frame(colours = unique(g$data[[1]]["colour"]), 
             label = levels(g$plot$data[, g$plot$labels$colour]))

Output:

     colour      label
1   #F8766D     setosa
51  #00BA38 versicolor
101 #619CFF  virginica

Update:

If there is a p <- p + scale_color_discrete(labels=c("sp1","sp2","sp3")) then you could do:

g <- ggplot_build(p)
data.frame(colours = unique(g$data[[1]]["colour"]), 
             label = g$plot$scales$scales[[1]]$labels)

Which outputs:

     colour label
1   #F8766D   sp1
51  #00BA38   sp2
101 #619CFF   sp3


标签: r ggplot2