如何使用 tmap 从宽 df 创建具有时间序列的地图

How to create a map with time series from a wide df using tmap

我想创建一张地图(或者,更好的是,一系列地图)来表示人口如何随时间演变。

为了清楚起见,我将使用 tmap 的内置 metro 样本数据。

library(tmap)
data("World", "metro")

> str(metro@data)
'data.frame':   436 obs. of  12 variables:
 $ name     : chr  "Kabul" "Algiers" "Luanda" "Buenos Aires" ...
 $ name_long: chr  "Kabul" "El Djazair  (Algiers)" "Luanda" "Buenos Aires" ...
 $ iso_a3   : chr  "AFG" "DZA" "AGO" "ARG" ...
 $ pop1950  : num  170784 516450 138413 5097612 429249 ...
 $ pop1960  : num  285352 871636 219427 6597634 605309 ...
 $ pop1970  : num  471891 1281127 459225 8104621 809794 ...
 $ pop1980  : num  977824 1621442 771349 9422362 1009521 ...
 $ pop1990  : num  1549320 1797068 1390240 10513284 1200168 ...
 $ pop2000  : num  2401109 2140577 2591388 12406780 1347561 ...
 $ pop2010  : num  3722320 2432023 4508434 14245871 1459268 ...
 $ pop2020  : num  5721697 2835218 6836849 15894307 1562509 ...
 $ pop2030  : num  8279607 3404575 10428756 16956491 1718192 ...
> 

可以看出,数据是按宽格式构建的,其中有几个变量(每年一个),它们有自己的一组值。我知道我可以使用 tmap 的分面并创建一个包含每一列名称的向量,如下所示:

tm_shape(World) +
  tm_polygons() +
tm_shape(metro) +
  tm_dots(c("pop2010", "pop2020"), col = c("pop2010", "pop2020"),
          size = c("pop2010", "pop2020"), border.col = "black")

这就是输出:

可以看出数据已经搞砸了,因为我希望每个方面只显示每年的人口(大小和颜色),但我不知道这些形状是从哪里来的。

你能告诉我我做错了什么吗?

我不确定当您只有一个变量(人口规模)时,为什么要以 两种颜色显示人口。

您可以尝试以下方法:

library(tmap)
data("World", "metro")
tm_shape(World) + tm_polygons() + 
tm_shape(metro) + tm_dots(size = c("pop2010", "pop2020"), col = "red", border.col = "black")

这将产生下图 - 都市区地图,圆点的大小表示人口规模。红色是我的重点(默认为黑色)。