【发布时间】:2015-03-26 23:18:00
【问题描述】:
作为对@hrbrmstr 出色答案的回应而编辑:
我正在绘制 2 组国家/地区的地图,并且想要一个图例来配合它。由于我使用的是自己的数据,因此很难提供 MRE。在我之前的代码中,我使用 geom_polygon 绘制形状(从 shapefile 读取),因为 fortify 丢弃了关联数据框的附加数据:
ggplot() + aes(long, lat, group = group) + theme_bw() +
scale_x_continuous(limits = c(-15, 35)) +
scale_y_continuous(limits = c(25, 75)) +
scale_fill_manual("Affected?", labels = c("Yes", "No"),
values = c("gray10", "gray80")) +
geom_polygon(data = affected.countries, fill = "gray10", color = "black") +
geom_polygon(data = unaffected.countries, fill = "gray80", color = "black")
结果:
现在我尝试从@hrbrmstr 的剧本中获取一页。因为fortify 丢弃了我的其他列,所以我制作了原始数据的两个子集,它们属于SpatialPolygonsDataFrame 类。我fortify 他们并给了他们一个虚拟变量来显示我需要什么,然后尝试使用布尔列来绘制它们来控制填充:
affected.countries <- fortify(affected.countries)
affected.countries$affected <- T
unaffected.countries <- fortify(unaffected.countries)
unaffected.countries$affected <- F
# all.countries now contains column affected
all.countries <- rbind(affected.countries, unaffected.countries)
gg <- ggplot() + coord_map(xlim = c(-13, 35), ylim = c(32, 71)) + theme_bw()
# Base map
gg <- gg + geom_map(data = all.countries, map = all.countries,
aes(x = long, y = lat, map_id = id),
fill = NA, color="gray10")
# Base map looks OK
gg
# Add filled data
gg <- gg + geom_map(data = all.countries, map = all.countries,
aes(fill = affected, map_id = id),
fill="gray10")
# For some reason, everything is filled!
gg <- gg + scale_fill_manual("Affected?", labels = c("No", "Yes"),
values = c("gray80", "gray10"))
# And the legend isn't shown
gg
对于这些结果:
我认为问题在于我的fill 参数不在aes 中,但它就在这里。可悲的是,我没有看到像@hrbrmstr 的回答那样使用第二个数据框的方法,因为我的数据中没有适当的列,但我认为布尔列可以解决它。虽然我可以通过破解答案中的代码来做到这一点,但我更喜欢我自己的国家边界。
值得注意的是,如果我在aes 之外但在geom_polygon 调用中包含fill 参数,则填充工作正常,但未显示图例。如果我在aes 中指定颜色,则会显示一种看似随机的颜色。
我缺少什么原则?再次感谢!
【问题讨论】:
-
您的
fill=不在aes映射中 -
这显示了我的图例,但标签或颜色不正确。
-
您指定了两次填充
aes(fill = affected), fill = "gray"。这些都是矛盾的。如果您需要图例,仅指定填写aes。要手动选择填充颜色,请使用scale_fill_manual(如您所愿)。 -
谢谢!做到了。如果您将其发布为答案,我会接受:)