当 tmap 工作正常时,如何解决 ggplot 中缺少变量的问题?

How do I fix this missing variable problem in ggplot when tmap works fine?

我有一个很大的空间数据框,head这里的信息:

class       : SpatialPolygonsDataFrame 
features    : 6 
extent      : 1268821, 1610480, 4828587, 5485976  (xmin, xmax, ymin, ymax)
crs         : +proj=tmerc +lat_0=0 +lon_0=173 +k=0.9996 +x_0=1600000 +y_0=10000000 +ellps=GRS80 +units=m +no_defs 
variables   : 3
names       :       TA2013_label, TimaruID, DistrictShortNames 
min values  : Ashburton District,        0,          Ashburton 
max values  :       Dunedin City,        0,       Dunedin City 

根据 header 中的建议,我有:SouthIslandTAs@data@TA2013_labelSouthIslandTAs@data@TimaruIDSouthIslandTAs@data@DistrictShortNamesTA2013_label是一个23级的因子,TimaruID是数值(0,1),DistrictShortNames是字符。以前,数据包含新西兰所有领土地方当局的标签。我删除了北岛数据并将因子水平的数量减少到南岛剩余的 23 个。

我无法在 ggplot 中绘制这张地图。但是,它使用 tmap 包绘制得很好。但是后者在另存为 PDF 时会在绘图周围产生较大的白色边距,我不知道如何删除它们,因此转向 ggplot.

这是 tmap 的代码:

tm_shape(SouthIslandTAs) + tm_polygons("TimaruID", group= "TA2013_label", border.col="grey", style = "jenks", 
                                   palette = "Greens") +
  tm_layout(legend.show = FALSE) +
  tm_text("DistrictShortNames", size=.6, col= "black")

我得到一张南岛 (NZ) 领土当局的地图,与其他 TA 的浅绿色相比,提马鲁区显示为深绿色。

但我无法让代码在 ggplot 中运行。

我试过:

ggplot(data = SouthIslandTAs, aes(x = long, y = lat, fill = TA2013_label, group = group)) +
geom_polygon()
Regions defined for each Polygons
Error in FUN(X[[i]], ...) : object 'TA2013_label' not found

ggplot() + 
geom_polygon(data = SouthIslandTAs, aes(x=long, y = lat, group = group), fill = TA2013_label, color = "red")
Regions defined for each Polygons
Error in FUN(X[[i]], ...) : object 'TA2013_label' not found

ggplot() + 
geom_polygon(data = SouthIslandTAs, aes(x=long, y = lat, group = TA2013_label), fill = TimaruID, color = "red")
Error in layer(data = data, mapping = mapping, stat = stat, geom = GeomPolygon,  : 
object 'TimaruID' not found

ggplot() + 
geom_polygon(data = SouthIslandTAs, aes(x=long, y = lat, group = TA2013_label), fill = "TimaruID", color = "red")
Regions defined for each Polygons
Error in FUN(X[[i]], ...) : object 'TA2013_label' not found

认为可能是缺少 @data 的问题,我尝试将其添加进去并得到以下错误(并且没有情节):

 ggplot(data = SouthIslandTAs, aes(x = long, y = lat, fill = data@TA2013_label, group = group)) +   
 geom_polygon()
 Regions defined for each Polygons
 Error in FUN(X[[i]], ...) : 
 trying to get slot "TA2013_label" from an object of a basic class ("function") with no slots

我可以得到基本的绘图输出:

ggplot() + geom_polygon(data = SouthIslandTAs, aes(x=long, y = lat, group = group))

ggplot() + 
geom_polygon(data = SouthIslandTAs, aes(x=long, y = lat, group = group), fill = NA, color = "red")

但是对于这两个我都收到了相同的警告:

Regions defined for each Polygons

我不明白为什么 tmap 可以处理数据,但 ggplot 就不行。我没有收到 tmap.

的错误或警告

没有数据集的可重现示例,很难确定问题的解决方案,但也许您可以在将数据转换为 sf 对象后使用 ggplot2 绘制数据,然后使用 geom_sf:

library(sf)
library(sp)
library(ggplot2)
SF_Obj <- st_as_sf(SouthIslandTAs, fill = TRUE, plot = FALSE)
ggplot()+ geom_sf(data = SouthIslandTAs, aes(fill = TA2013_label))

这里是一个使用来自 raster 包的美国地图的示例:

States <- raster::getData("GADM", country = "United States", level = 1)  
ggplot() + geom_polygon(data = States, aes(x=long, y = lat, group = group, fill = NAME_1))

我得到了和你一样的错误:

Regions defined for each Polygons Error in FUN(X[[i]], ...) : object 'NAME_1' not found

但是当我这样做时:

library(sf)
library(sp)
library(ggplot2)
library(dplyr)
sf_states <- sf::st_as_sf(States, plot = FALSE, fill = TRUE)
sf_states %>% filter(!(NAME_1 %in% c("Alaska","Hawaii"))) %>% 
  ggplot() + geom_sf(aes(fill = NAME_1), show.legend = FALSE)

我得到:

指定特定的填充颜色

要指定从 sf 对象开始的特定颜色,您可以创建一个指定颜色名称的新列,然后使用 scale_fill_identity:

library(sf)
library(sp)
library(ggplot2)
library(dplyr)
sf_states %>% filter(!(NAME_1 %in% c("Alaska","Hawaii"))) %>% 
  mutate(COLOR = ifelse(NAME_1 %in% c("Oregon","Florida"),"green","red")) %>%
  ggplot() + geom_sf(aes(fill = COLOR), show.legend = FALSE)+
  scale_fill_identity()

如果您更喜欢根据国家/地区填充 0 和 1,您可以通过以下操作获得相同的图:

sf_states %>% filter(!(NAME_1 %in% c("Alaska","Hawaii"))) %>% 
  mutate(COLOR = ifelse(NAME_1 %in% c("Oregon","Florida"),1,0)) %>%
  ggplot() + geom_sf(aes(fill = as.factor(COLOR)), show.legend = FALSE)+
  scale_fill_manual(values = c("red","green"))

它能回答您的问题吗?如果没有,请考虑提供一个可重现的数据集示例