Статьи

Использование R: Работа с геопространственными данными (и ggplot2)

Этот пост был изначально написан Бетани Йоллин в блоге Working With Data.

Это продолжение блога к предыдущему вступительному сообщению Стивена Брея:  Использование R: Работа с геопространственными данными . В этом посте мы научимся отображать геопространственные данные в ggplot2. Почему мы можем захотеть сделать это? Ну, это действительно о твоем личном вкусе. Некоторые люди готовы отказаться от тонкой baseнастройки графики в обмен на элегантность ggplot. Выбор полностью за вами.

Для начала нам понадобится ggplot2пакет и некоторые данные! Набор данных, который мы рассмотрим, — это шейп-файлы, определяющие водоразделы в штате Вашингтон.

ПРИМЕЧАНИЕ. Проверьте страницу данных ГИС Департамента экологии,   если какая-либо из ссылок недоступна.

Загрузка библиотек и данных

# load libraries
library(ggplot2)
library(sp)
library(rgdal)
library(rgeos)

# create a local directory for the data
localDir <- "R_GIS_data"
if (!file.exists(localDir)) {
  dir.create(localDir)
}

# download and unzip the data
url <- "ftp://www.ecy.wa.gov/gis_a/inlandWaters/wria.zip"
file <- paste(localDir, basename(url), sep='/')
if (!file.exists(file)) {
  download.file(url, file)
  unzip(file,exdir=localDir)
}

# create a layer name for the shapefiles (text before file extension)
layerName <- "WRIA_poly"

# read data into a SpatialPolygonsDataFrame object
dataProjected <- readOGR(dsn=localDir, layer=layerName)

Преобразование данных

Пока что мы не сделали ничего радикально отличного от предыдущего, но для того, чтобы подготовить данные для построения графика в ggplot, нам нужно будет сделать пару манипуляций со структурой данных. ggplot2будет работать только с data.frameобъектом, поэтому наш объект класса SpatialPolygonsDataFrameне будет подходящим для построения. Давайте напишем некоторый код и обсудим, почему этот вид преобразования необходим.

# add to data a new column termed "id" composed of the rownames of data
dataProjected@data$id <- rownames(dataProjected@data)

# create a data.frame from our spatial object
watershedPoints <- fortify(dataProjected, region = "id")

# merge the "fortified" data with the data from our spatial object
watershedDF <- merge(watershedPoints, dataProjected@data, by = "id")

# NOTE : If we so choose, we could have loaded the plyr library to use the
#      : join() function. For those familiar with SQL, this may be a more
#      : intuitive way to understand the merging of two data.frames. An
#      : equivalent SQL statement might look something like this:
#      : SELECT *
#      : FROM dataProjected@data
#      : INNER JOIN watershedPoints
#      : ON dataProjected@data$id = watershedPoints$id

# library(plyr)
# watershedDF <- join(watershedPoints, dataProjected@data, by = "id")

Что означает весь этот код и зачем он нам нужен? Давайте пройдемся по этой строке за строкой.

dataProjected@data$id <- rownames(dataProjected@data)

Здесь мы добавляем к данным дополнительный столбец с именем «id». Этот столбец будет содержать имена строк, поэтому мы определим явную связь между данными и полигонами, связанными с этими данными.

watershedPoints <- fortify(dataProjected, region = "id")

Fortify? Что это вообще значит? Быстрый поиск в Интернете даст полезную документацию. (См. Документацию fortify.sp ). В основном, fortifyвозьмите два аргумента:, modelкоторый будет состоять из SpatialPolygonsDataFrameобъекта, который мы хотим преобразовать, и regionимя переменной, по которой нужно разделить регионы. Если все идет по плану, происходит какая-то магия, и мы получаем data.frame, как мы и хотели … ну, не совсем. Если вы проверите это data.frame, вы заметите, что в нем отсутствует какая-то важная информация. Не волнуйтесь! Используя отношения, которые мы создали ранее, мы можем объединить эти два набора данных с помощью следующей команды.

watershedDF <- merge(watershedPoints, dataProjected@data, by = "id")

И альт! Теперь, когда мы создали , data.frameчто ggplot2любит, мы можем начать построение. Прежде чем мы начнем рисовать, давайте взглянем на это новое, data.frameчто мы создали.

head(watershedDF)
##   id    long     lat order  hole piece group WRIA_ID WRIA_NR WRIA_AREA_
## 1  0 2377934 1352106     1 FALSE     1   0.1       1      62     789790
## 2  0 2378018 1352109     2 FALSE     1   0.1       1      62     789790
## 3  0 2382417 1352265     3 FALSE     1   0.1       1      62     789790
## 4  0 2387199 1352434     4 FALSE     1   0.1       1      62     789790
## 5  0 2387693 1352452     5 FALSE     1   0.1       1      62     789790
## 6  0 2392524 1352623     6 FALSE     1   0.1       1      62     789790
##        WRIA_NM Shape_Leng Shape_Area
## 1 Pend Oreille     983140   3.44e+10
## 2 Pend Oreille     983140   3.44e+10
## 3 Pend Oreille     983140   3.44e+10
## 4 Pend Oreille     983140   3.44e+10
## 5 Pend Oreille     983140   3.44e+10
## 6 Pend Oreille     983140   3.44e+10

Ваш первый ggplot

Если вы исходите из baseграфики, часть синтаксиса может показаться пугающей, но это все часть «грамматики графики», после которой ggplot2моделируется. Вы заметите, что график строится слой за слоем, начиная с данных и отображения данных в «эстетические атрибуты». Мы добавим «geoms» или геометрические объекты и, возможно, мы вычислим некоторую статистику. Мы также можем настроить масштаб или систему координат. Все это может быть добавлено очень модульным способом; это одно из ключевых преимуществ использования ggplot2. Итак, хватит разговоров, давайте сделаем сюжет!

Продолжайте читать здесь.