如何使用 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 参数上使用了 nametmapggplot2 有点不同:

  • 如果您使用 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)