Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to combine scales for colour and size into one legend?

Tags:

r

ggplot2

I would like to know how to colorize the size_scale in scale_size() {ggplot2} in a plot where the size and color are from the same data.

Example:

 library(ggplot2)
    df<-as.data.frame(cbind(rep(1:10,10),
                            rep(1:10,each=10),
                            rnorm(100)))

    ggplot(df,aes(V1,V2))+
      geom_point(aes(colour=V3,size=V3))+
      scale_colour_gradient(low="grey", high="black")+
      scale_size(range=c(1,10))

As you can see the V3 is the same for the color and the size of the data points. How can I merge the color gradient to the size scale (except do this manually in program such as Illustrator...)? Thanks!

like image 900
nadizan Avatar asked May 05 '15 17:05

nadizan


2 Answers

Use the guides() function of ggplot2. In this case:

ggplot(df,aes(V1,V2))+
  geom_point(aes(colour=V3,size=V3))+
  scale_colour_gradient(low="grey", high="black")+
  scale_size(range=c(1,10)) +
  guides(color=guide_legend(), size = guide_legend())

ggplot2 will try to integrate the scales for you. It doesn't in this case because the default guide for a color scale is a colorbar and the default guide for size is a normal legend. Once you set them both to be legends, ggplot 2 takes over and combines them.

enter image description here

like image 94
Transcriptase Avatar answered Nov 03 '22 20:11

Transcriptase


This can be achieved by requesting to use not a colourbar but a legend for the colour. Using your data frame:

  ggplot(df,aes(V1,V2))+
     geom_point(aes(colour=V3,size=V3))+
     scale_colour_gradient(low="grey", high="black",guide="legend")+
     scale_size(range=c(1,10))

If you also want the colour bar, there is a little hack to achieve this that profits from the fact that you are not using the aesthetic fill. So you can map V3 to fill as well and it will draw a colourbar for this scale:

  ggplot(df,aes(V1,V2))+
     geom_point(aes(colour=V3,size=V3,fill=V3))+
     scale_colour_gradient(low="grey", high="black",guide="legend")+
     scale_size(range=c(1,10)) + 
     scale_fill_gradient(low="grey",high="black") +
     guides(fill=guide_colourbar(reverse=TRUE))

I added the call to guides in order to have the colours in the colourbar ordered the same way as in the legend for the sizes.

enter image description here

like image 35
Stibu Avatar answered Nov 03 '22 20:11

Stibu