如何使用 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")
这将产生下图 - 都市区地图,圆点的大小表示人口规模。红色是我的重点(默认为黑色)。
我想创建一张地图(或者,更好的是,一系列地图)来表示人口如何随时间演变。
为了清楚起见,我将使用 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")
这将产生下图 - 都市区地图,圆点的大小表示人口规模。红色是我的重点(默认为黑色)。