Этот пост был изначально написан Бетани Йоллин в блоге 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
. Итак, хватит разговоров, давайте сделаем сюжет!