Make a 2D legend for a plot - bi-variate choropleth maps

后端 未结 3 2086
情深已故
情深已故 2021-02-10 23:48

I have been playing with bi-variate choropleth maps and have gotten stuck on how to create a 2d legend similar to the one by Joshua Stevens shown here:

To illus

相关标签:
3条回答
  • 2021-02-11 00:31
    #test desired legend appearance
    library(ggplot2)
    library(reshape2)
    #use color scheme shown here http://www.joshuastevens.net/cartography/make-a-bivariate-choropleth-map/
    bvColors=c("#be64ac","#8c62aa","#3b4994","#dfb0d6","#a5add3","#5698b9","#e8e8e8","#ace4e4","#5ac8c8")
    melt(matrix(1:9,nrow=3))
    legendGoal=melt(matrix(1:9,nrow=3))
    test<-ggplot(legendGoal, aes(Var2,Var1,fill = as.factor(value)))+ geom_tile()
    test<- test + scale_fill_manual(name="More Var2  -->",values=bvColors,drop=FALSE)
    test<-test+guides(fill = guide_legend(nrow = 3))
    test<-test + theme(legend.text=element_blank())
    
    test
    

    The only remaining trick is to find a way to add some vertical on the side of the legend saying "More Var1 -->." Here's a butt-ugly way to do it:

    test<-ggplot(legendGoal, aes(Var2,Var1,fill = as.factor(value)))+ geom_tile()
    test<- test + scale_fill_manual(name="More Var2  -->",values=bvColors,labels=c("","","","","","","More","Var 1"," v "))
    test<-test+guides(fill = guide_legend(nrow = 3))
    #test<-test + theme(legend.text=element_blank())
    
    test
    

    But, as zx shows, extending ggplot2 with the cowplot package is the complete solution:

    #test desired legend appearance
    library(ggplot2)
    library(cowplot)
    library(reshape2)
    #use color scheme shown here http://www.joshuastevens.net/cartography/make-a-bivariate-choropleth-map/
    bvColors=c("#be64ac","#8c62aa","#3b4994","#dfb0d6","#a5add3","#5698b9","#e8e8e8","#ace4e4","#5ac8c8")
    melt(matrix(1:9,nrow=3))
    legendGoal=melt(matrix(1:9,nrow=3))
    test<-ggplot(legendGoal, aes(Var2,Var1,fill = as.factor(value)))+ geom_tile()
    test<- test + scale_fill_manual(name="",values=bvColors)
    test<-test+guides(fill = guide_legend(nrow = 3))
    test<-test + theme(legend.text=element_blank())
    test<-ggdraw(test) + draw_text(text = "More Var 2 -->",x=0.91,y=0.58)
    test<-ggdraw(test) + draw_text(text = "More Var 1 -->",x=0.84,y=0.5,angle=270)
    test
    

    Just for fun this is the map that I made with this technique:

    0 讨论(0)
  • 2021-02-11 00:42

    Not a complete answer, but I think you need to play with guides.

    ggplot(legendGoal, 
           aes(Var1,Var2,
               col=as.factor(value),
               fill=as.factor(value))) +
      geom_tile() +
      guides(col = guide_legend(nrow = 3))
    

    0 讨论(0)
  • 2021-02-11 00:47

    Okay, last update. The white space between columns bugs me and the grid feature of cowplot will let us use a shrunken plot as our bi-variate legend, like so:

    library(ggplot2)
    library(cowplot)
    library(reshape2)
    #use color scheme shown here http://www.joshuastevens.net/cartography/make-a-bivariate-choropleth-map/
    bvColors=c("#be64ac","#8c62aa","#3b4994","#dfb0d6","#a5add3","#5698b9","#e8e8e8","#ace4e4","#5ac8c8")
    melt(matrix(1:9,nrow=3))
    legendGoal=melt(matrix(1:9,nrow=3))
    test<-ggplot(legendGoal, aes(Var2,Var1,fill = as.factor(value)))+ geom_tile()
    test<- test + scale_fill_manual(name="",values=bvColors)
    test<-test + theme(legend.position="none")
    #test<-ggdraw(test) + draw_text(text = "More Var 2 -->",x=0.91,y=0.58)
    #test<-ggdraw(test) + draw_text(text = "More Var 1 -->",x=0.84,y=0.5,angle=270)
    
    #create a plot that will be the legend itself
    lg<- test #would not be true when making a map
    lg<-lg + theme(axis.title.x=element_text(size=rel(1),color=bvColors[3])) + xlab("More Var2 -->")
    lg<-lg + theme(axis.title.y=element_text(size=rel(1),color=bvColors[3])) + ylab("More Var1 -->")
    lg<-lg+theme(axis.text=element_blank())
    lg<-lg+theme(line=element_blank())
    #put both plots on a grid
    ggdraw()+ draw_plot(lg,0.1,0.7,width=0.2,height=0.2) +draw_plot(test,0.3,0,width=.7,height=.7)
    

    Pretty, yes?

    0 讨论(0)
提交回复
热议问题