Как я могу исправить эту проблему отсутствующей переменной в ggplot, когда tmap работает нормально? - PullRequest
0 голосов
/ 25 февраля 2020

У меня большой фрейм пространственных данных, 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@TimaruID и SouthIslandTAs@data@DistrictShortNames. TA2013_label - это коэффициент с 23 уровнями, TimaruID - это число c (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")

Я получаю карту территориальных властей Южного острова (Новая Зеландия) с районом Тимару, который обозначен более темным зеленым цветом по сравнению со светло-зеленым для остальных ТП.

Но я невозможно получить код, работающий в 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

Я могу получить базовый c вывод графиков:

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.

1 Ответ

3 голосов
/ 25 февраля 2020

Без воспроизводимого примера вашего набора данных трудно быть уверенным в решении вашего вопроса, но, возможно, вы можете построить свои данные с помощью 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)

я получу:

enter image description here

Назначение спецификаций c цвет заливки

Назначение спецификаций c цветов, начиная с 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()

enter image description here

Если вы предпочитаете заполнение с помощью 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"))

Отвечает ли он на ваш вопрос? Если нет, рассмотрите возможность воспроизведения воспроизводимого примера набора данных

...