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

问题描述

我有一个很大的空间数据框,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 

正如标题中所建议的,我有:SouthIslandTAs@data@TA2013_label、、SouthIslandTAs@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) 领土当局的地图,其中 Timaru 区显示为深绿色,与其他 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

标签: rggplot2gistmap

解决方案


如果没有数据集的可重现示例,很难确定问题的解决方案,但也许您可以在将数据ggplot2转换为 sf 对象后绘制数据,然后使用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))

我得到和你一样的错误:

FUN(X[[i]], ...) 中为每个多边形定义的区域错误:找不到对象“NAME_1”

但是当我这样做时:

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"))

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


推荐阅读