22

我正在尝试ggplot2使用来自不同数据帧的数据来构建地图。

library(maptools)

xx <- readShapePoly(system.file("shapes/sids.shp", package="maptools")[1], IDvar="FIPSNO", proj4string=CRS("+proj=longlat +ellps=clrk66"))

xx.sub1 <- subset(xx, xx$FIPSNO < 37010)
xx.sub2 <- subset(xx, xx$FIPSNO > 37010)

xx.sub1@data$id <- rownames(xx.sub1@data)
xx.sub1.points <- fortify(xx.sub1, region="id")
xx.sub1.df = plyr::join(xx.sub1.points, xx.sub1@data, by="id")

xx.sub2@data$id <- rownames(xx.sub2@data)
xx.sub2.points <- fortify(xx.sub2, region="id")
xx.sub2.df = plyr::join(xx.sub2.points, xx.sub2@data, by="id")

ggplot(xx.sub2.df) + 
  aes(long, lat, fill = (SID79/BIR79)*1000, group = group) + 
  geom_polygon() + geom_path(color="grey80") +
  coord_equal() + 
  scale_fill_gradientn(colours = RColorBrewer::brewer.pal(7, "YlOrBr")) +
  geom_polygon(data = xx.sub1.df, fill = "grey50") + 
  geom_path(data = xx.sub1.df, color="grey80") +
  labs(fill = "Mapped value", title = "Title")

到目前为止,一切都按预期工作,我得到了一张漂亮的地图:

在此处输入图像描述

但是,我想更改的是为数据添加单独的图例xx.sub1.df- 因为所有多边形都只是用灰色填充,我希望这将是一个额外的条目。

我怎样才能做到这一点?

4

1 回答 1

32

我不是 100% 确定这是你想要的,但这是我理解的解决问题的方法。如果我们将一些未geom使用的数据与来自 的任何数据进行映射xx.sub1.df,但使其在绘图上不可见,我们仍然可以获得该图例geom。这里我用过geom_point,但你可以用其他的。

p <- ggplot(xx.sub2.df) + 
  aes(long, lat, fill = (SID79/BIR79)*1000, group = group) + 
  geom_polygon() + geom_path(color="grey80") +
  coord_equal() + 
  scale_fill_gradientn(colours = brewer.pal(7, "YlOrBr")) +
  geom_polygon(data = xx.sub1.df, fill = "grey50") + 
  geom_path(data = xx.sub1.df, color="grey80") +
  labs(fill = "Mapped value", title = "Title")

#Now we add geom_point() setting shape as NA, but the colour as "grey50", so the 
#legend will be displaying the right colour

p2 <- p + geom_point(data = xx.sub1.df, aes(size="xx.sub1", shape = NA), colour = "grey50")

在此处输入图像描述

现在我们只需要更改图例上点的大小和形状,并更改图例的名称(感谢@DizisElferts 之前演示)。

p2 + guides(size=guide_legend("Source", override.aes=list(shape=15, size = 10)))

在此处输入图像描述

当然,您可以更改标签的工作方式或任何其他方式来突出显示您想要显示的内容。

如果这不是你想要的,请告诉我!

于 2013-05-14T04:50:54.850 回答