为绘图制作2D图例 - 双变量等值线图

时间:2015-09-23 21:33:23

标签: r plot ggplot2 gis

我一直在玩双变量等值区域地图,并且如何创建类似于此处显示的Joshua Stevens之类的2d图例:

enter image description here

为了说明挑战,我们不需要使用地图。以下代码就足够了:

#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")
legendGoal=melt(matrix(1:9,nrow=3))
test<-ggplot(legendGoal, aes(Var1,Var2))+ geom_tile(aes(fill = as.factor(value)))
test<- test + scale_fill_manual(name="Var1 vs Var2",values=bvColors,drop=FALSE)
test

它会创建一个看起来像我想要的传奇的情节,但当然传说是所有级别的垂直条。我希望传说看起来像情节本身。有没有办法做到这一点?谢谢!

3 个答案:

答案 0 :(得分:3)

#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

enter image description here

唯一剩下的诀窍是找到一种方法在图例旁边添加一些垂直方式,说“更多Var1 - &gt;”。这是一个很难实现的方法:

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

但是,正如zx所示,使用cowplot包扩展ggplot2是完整的解决方案:

#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

enter image description here

只是为了好玩,这是我使用这种技术制作的地图: NYC Pre-K Seats

答案 1 :(得分:1)

不是一个完整的答案,但我认为您需要使用guides

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

enter image description here

答案 2 :(得分:0)

好的,上次更新。列之间的空白区域让我感到烦恼,牛皮图的网格特征将让我们使用缩小的图作为我们的双变量图例,如下所示:

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)

enter image description here 漂亮,是吗?