使用ggplot2和geom_map对颜色编码的世界地图

时间:2016-10-12 17:20:01

标签: r ggplot2

我正在尝试绘制一张世界地图,其中每个国家/地区的颜色取决于数据框中变量的值。

> affiliation
# A tibble: 252 × 2
                 region value
                  <chr> <dbl>
1                 Aruba     0
2           Afghanistan     0
3                Angola     0
4              Anguilla     0
5               Albania     0
6               Finland     1
7               Andorra     0
8  United Arab Emirates     0
9             Argentina     2
10              Armenia     0
# ... with 242 more rows

我的代码工作正常:

library(ggplot2)
library(ggthemes)

ggplot(affiliation, aes(map_id = region)) + 
    geom_map(aes(fill = value), map = worldMap, color='grey', size=0.3) + 
    expand_limits(x = worldMap$long, y = worldMap$lat) +
    theme_few()+
    theme(legend.position = "bottom",
         axis.ticks = element_blank(), 
         axis.title = element_blank(), 
         axis.text =  element_blank()) +
    scale_fill_gradient(low="white", high="darkblue", name="Number of Affiliates") +
    guides(fill = guide_colorbar(barwidth = 10, barheight = .5))

我的问题是,大多数值都是0,1或2,20-30但是1个离群值国家中的值非常少,而330中的值。这使得颜色范围无用,因为该国家显示为饱和状态颜色较低的所有国家都显示为白色。

我尝试将geom_map(aes(fill = value),…替换为geom_map(aes(fill = log(value)),…,但在这种情况下,图例中的比例显示0到5+(而不是0到330)。

如何更好地控制价值较低的许多国家/地区的色彩饱和度,以便在世界地图上更加清晰可见? 谢谢

2 个答案:

答案 0 :(得分:2)

而不是scale_fill_gradient,为什么不尝试拨打scale_fill_gradientn,根据需要设置颜色停止。例如:

scale_fill_gradientn(colours = c('#ff0000', '#cccccc', '#0000ff'), values = c(0, 30, 331))

答案 1 :(得分:2)

ggplot2中的大多数连续scale函数接受trans参数,该参数指定要在该美学上使用的转换。这将自动处理转换和标记。

在您的示例中,向trans = "log1p"的参数添加"log"(不只是0,因为您的数据有几个scale_gradient_n值)可能有所帮助。