如何使用 R 中的 tmap 在同一数据帧中包含多个图层?
How to include multiple layers within the same dataframe using tmap in R?
我正在处理一些 public 数据集,可以是 'stack_question' 文件夹中的 accessed here。
我正在尝试使用 R
中的 tmap
库创建堪萨斯州内所有超市的地图。使用 ggplot
,我使用以下代码生成了一个地图:
library(pacman)
p_load(sf, tidyverse, tmap)
#Read in data
super <- readRDS('supermarket_pt.RDS')
ct<-st_read("US_tract_2010.shp")
food <- read_csv('FoodAtlas.csv')
#Reproject so datasets are projeted in the same way
super <- st_transform(super, st_crs(ct))
#Change data structure to 'numeric'
ct$GEOID10 <- as.numeric(ct$GEOID10)
food$CensusTract <- as.numeric(food$CensusTract)
#Selct for relevant columns to combine the dataset
food <- food %>%
select(CensusTract:County)
#Left join ct and modified food dataset
sup <- left_join(ct, food, by = c('GEOID10' = 'CensusTract'))
#Filter dataset to desired state
ks <- sup %>%
filter(State == "Kansas")
#Find the supermarkets in Kansas
super_ks <- super[ks, op = st_within]
#Plot the data
ggplot() +
geom_sf(data = ks) +
geom_sf(data = super_ks, color = 'steelblue', shape = 18, size = 2)
输出如下图,正确:
我需要制作与 tmap
相同的图像。问题是当我 运行 以下代码时出现错误:
#Set tmap mode
tmap_mode('plot')
#Spatially join data
super_state <- st_join(ks, super_ks, join = st_contains, left = TRUE)
na.omit(super_state)
#Generate KS map
qtm(super_state)+
tm_bubbles('name', col = 'steelblue')
错误:
Error: size argument of tm_symbols/tm_dots is not a numeric variable
当我尝试此代码时,我得到的图像生成了我不想要的图像:
tm_shape(super_state) +
tm_polygons('name')
如何使我的 tmap
地图看起来像第一张地图?
我试图复制地图,但文件 FoodAtlas.csv
丢失了。我认为这应该可行(只需使用您用于 ggplot2
的相同数据):
# Same with tmap, you don't need to create new spatial objects
tm_shape(ks) +
tm_polygons() +
tm_shape(super_ks) +
tm_dots("steelblue", shape = 18, size = 2)
您正在获取第二张地图,因为您在 col
参数上使用了 name
。 tmap
与 ggplot2
有点不同:
- 如果您使用
tm_polygons(col="<variable>")
,您会得到一张等值线图。 ggplot 中的等价物是 geom_sf(aes(fill=<variable>))
.
- 如果您使用
tm_polygons(col="red" )
或一般颜色的名称,您会得到每个多边形都填充该颜色的形状(相当于 geom_sf(fill="<a color>")
.
所以基本上,在 ggplot2
上你需要明确声明层的类型(使用或不使用 aes
,取决于你的地图)但在 tmap
中这取决于变量的类型。在这里查看完整的代表:
library(pacman)
p_load(sf, tidyverse, tmap, giscoR)
# Mock your data
ks <- gisco_get_nuts(country = "Belgium", nuts_level = 3)
super_ks <- gisco_get_healthcare(country = "Belgium")
super_ks <- st_transform(super_ks, st_crs(ks))
# Test1: Simple map, plot just the layers
ggplot() +
geom_sf(data = ks) +
geom_sf(data = super_ks, color = 'steelblue', shape = 18, size = 2)
# Same with tmap
tm_shape(ks) +
tm_polygons() +
tm_shape(super_ks) +
tm_dots("steelblue", shape = 18, size=.5)
# Test 2: Using aes/col: Thematic map
ggplot() +
geom_sf(data=ks, aes(fill=NUTS_ID)) +
geom_sf(data = super_ks, color = 'steelblue', shape = 18, size = 2)
# Same with tmap
tm_shape(ks) +
tm_polygons("NUTS_ID") +
tm_shape(super_ks) +
tm_dots("steelblue", shape = 18, size=.5)
我正在处理一些 public 数据集,可以是 'stack_question' 文件夹中的 accessed here。
我正在尝试使用 R
中的 tmap
库创建堪萨斯州内所有超市的地图。使用 ggplot
,我使用以下代码生成了一个地图:
library(pacman)
p_load(sf, tidyverse, tmap)
#Read in data
super <- readRDS('supermarket_pt.RDS')
ct<-st_read("US_tract_2010.shp")
food <- read_csv('FoodAtlas.csv')
#Reproject so datasets are projeted in the same way
super <- st_transform(super, st_crs(ct))
#Change data structure to 'numeric'
ct$GEOID10 <- as.numeric(ct$GEOID10)
food$CensusTract <- as.numeric(food$CensusTract)
#Selct for relevant columns to combine the dataset
food <- food %>%
select(CensusTract:County)
#Left join ct and modified food dataset
sup <- left_join(ct, food, by = c('GEOID10' = 'CensusTract'))
#Filter dataset to desired state
ks <- sup %>%
filter(State == "Kansas")
#Find the supermarkets in Kansas
super_ks <- super[ks, op = st_within]
#Plot the data
ggplot() +
geom_sf(data = ks) +
geom_sf(data = super_ks, color = 'steelblue', shape = 18, size = 2)
输出如下图,正确:
我需要制作与 tmap
相同的图像。问题是当我 运行 以下代码时出现错误:
#Set tmap mode
tmap_mode('plot')
#Spatially join data
super_state <- st_join(ks, super_ks, join = st_contains, left = TRUE)
na.omit(super_state)
#Generate KS map
qtm(super_state)+
tm_bubbles('name', col = 'steelblue')
错误:
Error: size argument of tm_symbols/tm_dots is not a numeric variable
当我尝试此代码时,我得到的图像生成了我不想要的图像:
tm_shape(super_state) +
tm_polygons('name')
如何使我的 tmap
地图看起来像第一张地图?
我试图复制地图,但文件 FoodAtlas.csv
丢失了。我认为这应该可行(只需使用您用于 ggplot2
的相同数据):
# Same with tmap, you don't need to create new spatial objects
tm_shape(ks) +
tm_polygons() +
tm_shape(super_ks) +
tm_dots("steelblue", shape = 18, size = 2)
您正在获取第二张地图,因为您在 col
参数上使用了 name
。 tmap
与 ggplot2
有点不同:
- 如果您使用
tm_polygons(col="<variable>")
,您会得到一张等值线图。 ggplot 中的等价物是geom_sf(aes(fill=<variable>))
. - 如果您使用
tm_polygons(col="red" )
或一般颜色的名称,您会得到每个多边形都填充该颜色的形状(相当于geom_sf(fill="<a color>")
.
所以基本上,在 ggplot2
上你需要明确声明层的类型(使用或不使用 aes
,取决于你的地图)但在 tmap
中这取决于变量的类型。在这里查看完整的代表:
library(pacman)
p_load(sf, tidyverse, tmap, giscoR)
# Mock your data
ks <- gisco_get_nuts(country = "Belgium", nuts_level = 3)
super_ks <- gisco_get_healthcare(country = "Belgium")
super_ks <- st_transform(super_ks, st_crs(ks))
# Test1: Simple map, plot just the layers
ggplot() +
geom_sf(data = ks) +
geom_sf(data = super_ks, color = 'steelblue', shape = 18, size = 2)
# Same with tmap
tm_shape(ks) +
tm_polygons() +
tm_shape(super_ks) +
tm_dots("steelblue", shape = 18, size=.5)
# Test 2: Using aes/col: Thematic map
ggplot() +
geom_sf(data=ks, aes(fill=NUTS_ID)) +
geom_sf(data = super_ks, color = 'steelblue', shape = 18, size = 2)
# Same with tmap
tm_shape(ks) +
tm_polygons("NUTS_ID") +
tm_shape(super_ks) +
tm_dots("steelblue", shape = 18, size=.5)