Як створювати фонові картограми

Матеріал з Вікіпідручника

Як створювати фонові картограми в R[ред.]

Система R дає можливість порівняно нескладно створювати фонові картограми. Подивимось, як це робиться.

Крок 1[ред.]

Після успішного завершення установки R слід встановити додаткові пакети, необхідні для подальшої роботи з фоновими картограмами: «sp» та «RColorBrewer». Для цього слід виконати команди:

install.packages("sp", dependencies = TRUE)
install.packages("RColorBrewer", dependencies = TRUE)

Границі адміністративних одиниць України можна отримати на сайті проекту GADM.org. Для завантаження слід обрати файли формату R (SpatialPolygonsDataFrame). Наразі пропонується три варіанти файлів: рівня 0 (Україна в цілому), рівня 1 (Україна та області), рівня 2 (райони).

Спершу розглянемо процес створення фонових картограм для областей України (рівень 1). Намалюємо просту незаповнену карту областей:

library(sp)
library(RColorBrewer)

# Завантаження даних
load("gadm.org/UKR_adm1.RData")
ukr <- gadm

# Намалюємо просту карту
spplot(ukr, "PID")

В результаті отримаємо картинку:

Проста карта України з виділеними областями

Кольори для намальованих регіонів слід вказати в параметрі col.regions. Якщо функція малює категоризовані дані, то кількість кольорів має дорівнювати кількості категорій. Наприклад, розфарбуємо області в довільні кольори, для цього скористаємось функцією rainbow, яка повертає вектор з заданої кількості кольорів:

col = rainbow(length(ukr$NAME_1))
spplot(ukr, "PID", col.regions=col)

Отримаємо зображення:

Області зафарбовані у випадкові кольори

Крок 2[ред.]

Тепер можна переходити до створення фонової картограми. Візьмемо за основу дані Держкомстату «Обсяги обороту роздрібної торгівлі за січень–лютий 2012 року» та оберемо «Темпи зростання обороту роздрібної торгівлі (у порівнянних цінах)» як показник до візуалізації.

На жаль, перед виконанням наступних кроків необхідно усунути проблему неспівпадіння послідовності адміністративних одиниць в таблиці даних Держкомстату, та послідовністю об'єктів адміністративних одиниць в масиві географічних об'єктів з бази GADM. Для усунення цього неспівпадіння знадобиться масив перестановок, назвемо його order. Географічні об'єкти впорядковані за алфавітним порядком транскрибованих назв адміністративних одиниць, в той час як таблиця Держкомстату використовує українські назви для впорядкування за алфавітом. Через порівняно невелику кількість об'єктів, масив перестановок order можна скласти вручну. Він матиме такі значення:

order <- c(23, 25, 24, 1, 4,    # [5]
           5, 9, 20, 21, 22,    # [10]
           26, 10, 11, 13, 12,  # [15]
           14, 15, 16, 17, 27,  # [20]
           18, 19, 7, 2, 3,     # [25]
           8, 6)                # [27]

Елемент i цього масиву містить індекс i-ї адміністративної одиниці з бази GADM в таблиці даних Держкомстату. Або: , де — індекс адміністративної одиниці в базі GADM; — індекс цього самого об'єкту в таблиці Держкомстату.

Відповідний масив перестановок для об'єктів другого рівня — районів, матиме понад 400 елементів, а його заповнення потребуватиме більших зусиль. Однак, при наявності масиву перестановок можна переходити до наступного кроку: категоризація даних, створення палітри, та малювання картограми.

Категоризація даних, або факторизація, виконується командами в одному рядку програми:

# Дані зі стовпчика таблиці
valsOrig <- c(116.5, 116.2, 116.7, 111.7, 117.0, 116.3,
              106.1, 116.7, 116.4, 117.3, 111.5, 108.0, 107.3,
              116.8, 116.0, 114.2, 114.5, 116.3, 113.6, 116.5,
              112.8, 116.8, 112.8, 106.8, 116.8, 116.2, 116.2)

# Факторизація
ukr$col_no <- cut(valsOrig[order],
                  c(106, 109, 112, 115, 118),
                  include.lowest = TRUE)
myPalette <- brewer.pal(4, "Greens")

Масивом c(106, 109, 112, 115, 118) тут задані границі категорій. Загалом задано 4 категорії, і тому потрібні 4 кольори для фарбування адміністративних одиниць (областей та міст республіканського підпорядкування). Палітру кольорів створює функція brewer.pal з пакета RColorBrewer. Залишилось лише намалювати картограму:

spplot(ukr,"col_no", col.regions=myPalette)

Результат виглядатиме так:

Остаточна фонова картограма темпів зростання обороту роздрібної торгівлі (у порівнянних цінах) для України

Результат[ред.]

Остаточний скрипт для створення цієї картограми виглядатиме так:

# Завантаження потрібних бібліотек
library(sp)
library(RColorBrewer)

# Завантаження даних
load("gadm.org/UKR_adm1.RData")
ukr <- gadm

order <- c(23, 25, 24, 1, 4,    # [5]
           5, 9, 20, 21, 22,    # [10]
           26, 10, 11, 13, 12,  # [15]
           14, 15, 16, 17, 27,  # [20]
           18, 19, 7, 2, 3,     # [25]
           8, 6)                # [27]

# Дані зі стовпчика таблиці
valsOrig <- c(116.5, 116.2, 116.7, 111.7, 117.0, 116.3,
              106.1, 116.7, 116.4, 117.3, 111.5, 108.0, 107.3,
              116.8, 116.0, 114.2, 114.5, 116.3, 113.6, 116.5,
              112.8, 116.8, 112.8, 106.8, 116.8, 116.2, 116.2)

# Факторизація
ukr$col_no <- cut(valsOrig[order],
                  c(106, 109, 112, 115, 118),
                  include.lowest = TRUE)
myPalette <- brewer.pal(4, "Greens")

spplot(ukr,"col_no", col.regions=myPalette)

Районний рівень[ред.]

Досі ми створювали фонові картограми для областей та міст республіканського підпорядкування, Києва та Севастополя. Процес створення фонових картограм для районів відбувається аналогічно, але через порівняно велику кількість адміністративних одиниць (понад 400 районів), таблиця перестановок, яку досі використовували для співставлення областей та географічних об'єктів, в цьому випадку буде незручною та неефективною.

Набагато зручніше співставляти географічні об'єкти та адміністративні одиниці через КОАТУУ — цифровий класифікатор об'єктів адміністративно-територіального устрою України. Для цього слід зберегти порядкові ідентифікатори та назви географічних об'єктів в текстовий файл, а потім додати новий стовпчик, в який слід записати дані КОАТУУ для кожного об'єкту. Тепер ці дані можна знову завантажити функцією read.table.

Як приклад, створимо фонову картограму для природного руху населення в 2009 році. Дані візьмемо з бази даних Держкомстату, таблиця 03011 «Кількість живонароджених, померлих і природний приріст населення». Після попередньої підготовки завантаженої таблиці, сформуємо файл CSV, в якому кожний рядок матиме дві комірки: КОАТУУ та значення показника. Тепер всі дані готові для опрацювання програмою:

library(sp)
library(RColorBrewer)

load("gadm.org/UKR_adm2.RData")

tbl <- read.table("koatuu.txt", header=TRUE)
gadm$koatuu <- tbl$koatuu

# dem_03011.txt - таблиця природного руху населення в 2009 р.
# http://stat6.stat.lviv.ua/ukrcensus/Database/Population/databasetree_no.asp
dem <- read.table("dem_03011.txt", header=TRUE)

total <- length(gadm$PID)
order <- vector()
vals <- vector()

pb <- txtProgressBar(min = 0, max = total, style = 3)

# медіана природного руху, можна використати для класифікації замість 0
median_delta <- median(dem$delta)
# кількість не знайдених географічних об'єктів/КОАТУУ
missing <- 0
for (i in 1:total) {
  t <- function(x) { gadm$koatuu[i] == x }
  pos <- Position(t, dem$koatuu, nomatch = -1)
  if (pos == -1) {
    missing <- missing + 1
    order[i] <- 1
  } else {
    order[i] <- pos
  }

  if (dem$delta[order[i]] > 0) {
    vals[i] <- 3
  } else if (dem$delta[order[i]] < 0) {
    vals[i] <- 1
  } else {
    vals[i] <- 2
  }
  setTxtProgressBar(pb, i)
}

print("кількість не знайдених рядків: ")
print(missing)

col_no <- as.factor(cut(vals, 3))
# назва класів для легенди на картограмі
levels(col_no) <- c("Від'ємне", "Незмінне", "Додатне")
gadm$col_no <- col_no

myPalette <- brewer.pal(3, "Spectral")

png("plot-dem_03011.png", width=800, height=600)

spplot(gadm, "col_no", col=grey(.9), col.regions=myPalette)

dev.off()

Результатом роботи програми буде така картограма:

Фонова картограма природного руху населення по районах України.

Дивіться також[ред.]