ggplot2:传奇不会显示

时间:2015-03-26 23:18:00

标签: r plot ggplot2

编辑为@ hrbrmstr的回答:

我映射了两组国家/地区,希望有一个传奇。由于我使用自己的数据,因此很难提供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")

结果:

Plot with no legend

现在我尝试从@ hrbrmstr的剧本中取一页。由于fortify会抛弃我的其他列,因此我创建了原始数据的2个子集,其类为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

对于这些结果:

Base map Filled map

我认为问题在于我的fill论证不在aes,但现在是。遗憾的是,我没有看到使用第二个数据帧的方法,如@ hrbrmstr的答案,因为我的数据中没有相应的列,但我认为布尔列会解决它。虽然我可以通过破解答案中的代码来做到这一点,但我更喜欢自己的国家边界。

值得注意的是,如果我将fill参数包含在aes之外,但在geom_polygon调用中,则填充正常,但图例未显示。如果我在aes中指定颜色,则会显示看似随机的颜色。

我错过了什么原则?再次感谢!

2 个答案:

答案 0 :(得分:4)

这是一个更完整的例子,因为在原始问题中没有使用投影或提供数据:

library(ggplot2)

europe <- map_data('world', 
                   region=c('Switzerland', 'Liechtenstein', 'Luxembourg',
                            'UK', 'Belgium', 'Norway', 'Germany', 'Ireland',
                            'Austria', 'France', 'Netherlands', 'Sweden',
                            'Denmark','Italy' ))

condition <- data.frame(region=c("Ireland", "France", "Netherlands",
                                 "Sweden", "Finland", "UK", "Germany"),
                        affected=c(TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE),
                        stringsAsFactors=FALSE)

gg <- ggplot()

# base map

gg <- gg + geom_map(data=europe, map=europe,
                    aes(x=long, y=lat, map_id=region),
                    color="#7f7f7f", fill="white", size=0.25)

# fills according to affected

gg <- gg + geom_map(data=condition, map=europe,
                    aes(fill=affected, map_id=region),
                    color="#7f7f7f", size=0.01)

# a minimally decent projection tho one of the conical ones is prbly better

gg <- gg + coord_map(xlim=c(-13, 35),  ylim=c(32, 71))

# fills for the aes mapping

gg <- gg + scale_fill_manual("Affected?", labels = c("No", "Yes"),
                             values = c("gray80", "gray10"))

# no need for axis labels since it's a map

gg <- gg + labs(x=NULL, y=NULL)
gg <- gg + theme_bw()
gg

enter image description here

正如格雷戈尔所指出的,这是一个次优投影(但由于原始帖子中没有投影,我不想在默认的墨卡托之外只抛出一个投影)。如果你想知道为什么我们中的一些人对SO的预测有所顾忌,那就以this one report为例(来自欧洲预测的许多研讨会之一的整篇文件)。

还有其他几种选择。首先,Lambert Conic Conformal,您可以通过将coord_map更改为:

来使用
gg <- gg + coord_map("lambert", lat0=32, lat1=71, xlim=c(-13, 35), ylim=c(32, 71))

enter image description here

即使链接到文档没有建议使用它,吉尔伯特也(IMO)是一个体面的使用:

gg <- gg + coord_map("gilbert", xlim=c(-13, 35), ylim=c(32, 71))

enter image description here

PDF还建议Azimuth Equal Area是首选方案:

gg <- gg + coord_map("azequalarea", xlim=c(-13, 35), ylim=c(32, 71))

enter image description here

答案 1 :(得分:0)

我没有按照所涉及的更新来处理您的整个问题。但也许在guide = TRUE中设置scale_fill_manual()可能很简单。请参阅Turning off some legends in a ggplot