绘制ggplot世界地图,其中国家/地区根据数字范围着色

时间:2020-11-10 13:12:20

标签: r ggplot2 maps

我第一次尝试用ggplot绘制地图,但在实现自己的想法时遇到了问题。

首先,我有一个数据框,其中每个国家/地区代码都与一个数字相关联。例如:

id        count
US        2030
DE        1001
UA        730
SY        229

我想获得一张ggplot地图,其中按数字范围对国家/地区进行着色(例如:超过2000个深红色,1000-2000红色,1000-600橙色,600-200黄色,小于100白色)。颜色本身并不重要,我只想让颜色越低就越浅。

这是我尝试过的:

 world_map <- map_data(map = "world")
 world_map$region <- iso.alpha(world_map$region)
    
 ggplot(df, aes(map_id = id)) +
   geom_map(aes(fill = frequency), map = world_map) +
   expand_limits(x = world_map$long, y = world_map$lat) +
   scale_colour_manual(name = "counts", values = cols,
                    breaks = c(2000,1000,600,200), 
                    labels=c("more than 2000","2000-1000","1000-600","600-200")) +  
   theme_void() +
   coord_fixed()

当我尝试执行此代码时,我收到以下错误消息

不知道如何为类型的对象自动选择比例 功能。默认为连续。错误:美学必须有效 数据列。有问题的美学:填充=频率。你是否 输入错误的数据列名称或忘记添加after_stat()?

现在,我了解到如何设置参数存在问题,但是我无法在Internet上找到任何解决方案(或者也许我是一个初学者,无法正确理解它)。

1 个答案:

答案 0 :(得分:2)

对于任何混乱,我深表歉意。我认为这就是您要寻找的。

首先,将使用cutcount列分组,并带有所需的标签。这将创建一个count_group因子。

如果您想对图例中的标签重新排序,则可以使用fct_rev中的forcats重新排序此因子。

然后,将其用于fill中的geom_map,您可以使用scale_fill_manual定义颜色。在这种情况下,您可能需要Reds调色板。

要添加国家/地区的边界,请使用geom_polygonNA进行填充。

library(maps)
library(RColorBrewer)
library(forcats)

df <- data.frame(
  id = c("US", "DE", "UA", "SY"),
  count = c(2030, 1001, 730, 229)
)

df$count_group <- cut(df$count, 
                      breaks = c(-Inf, 200, 600, 1000, 2000, Inf), 
                      labels = c("Less than 200", "600-200", "1000-600", "2000-1000", "More than 2000"))

world_map <- map_data(map = "world")
world_map$region <- iso.alpha(world_map$region)

ggplot(df) +
  geom_map(aes(map_id = id, fill = fct_rev(count_group)), map = world_map) +
  geom_polygon(data = world_map, aes(x = long, y = lat, group = group), colour = 'black', fill = NA) +
  expand_limits(x = world_map$long, y = world_map$lat) +
  scale_fill_manual(name = "Counts", values = rev(brewer.pal(5, name = "Reds"))) +
  theme_void() +
  coord_fixed()

图解

map with black borders and filled by count