【发布时间】:2013-05-05 22:09:13
【问题描述】:
我正在尝试使用来自不同数据帧的数据在 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 的数据添加单独的图例 - 因为所有多边形都只是用灰色填充,我希望这将是一个额外的条目。
我怎样才能做到这一点?
【问题讨论】:
-
请重复示例(tinyurl.com/reproducible-000)?解决这个问题的典型方法是合并数据集,包括一个因子变量,标识每个数据集来自哪个原始数据帧,然后使用美学(我认为在你的情况下填充)......你可能会看
scales包看看有没有其他方法 -
@BenBolker 罗杰。添加了示例。我知道将所有内容都放在一个df中会更容易。但是,我经常使用不同层次的数据(可能是我来自 GIS 背景的偏见),这将是一个痛苦的加入。在这个特定的示例中,我需要选择几个多边形并快速“突出显示”或“遮盖”它们。
-
能否请您添加
dput的数据,以便人们可以通过更新的热图回答您的问题?我猜想:(1)你只使用了xx.sub2的两列,(2)如果它们存在于xx.sub1中,它们会显示为灰色。因此,加入似乎并不那么烦人。您可以简单地在xx.sub2中为xx.sub1中的条目添加一个因子,也可以使用scale_fill_manual来调整图例中的颜色。 -
@GChalancon 我正在使用来自
maptools包的示例数据,我希望它允许示例的可重复性(我相信不再需要dput?)。至于第 1 点和第 2 点 - 玩具示例的所有有效选项。然而,对于真实场景,数据集更复杂,您的解决方案将更难实施。因此,我希望能够在没有连接的情况下使用“独立”数据框来实现这一目标。 -
哦,我之前没有尝试加载数据,我的错。主要困难是您想要映射使用相同类型美学的两个不同比例(
geom_polygon用于两个数据框)。据我所知,这在 ggplot2 中是不可能的,但这里有一个建议:如何使用不同的注释(例如geom_text)来标记“灰色”区域?它会给你 2 个传说,但我知道它可能不会那么令人满意。一件事:在真实情况下xx.sub1.df的区域是否可能与xx.sub2.df重叠?