【问题标题】:In ggplot2, how can I add additional legend?在 ggplot2 中,如何添加额外的图例?
【发布时间】: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 重叠?

标签: r ggplot2


【解决方案1】:

我不能 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 演示了这一点earlier)。

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

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

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

【讨论】:

  • 太好了!在我看来,除了添加可以添加图例的新美学(此处为geom_point)之外,它们没有其他解决方法。我不知道shape=NA,所以这真的很有用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-08-01
  • 2015-02-14
  • 2012-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多