Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
891 views
in Technique[技术] by (71.8m points)

r - How to extract the legend labels from a ggplot2 object?

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

iris example

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
See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

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

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...