
- •ПРЕДИСЛОВИЕ
- •1.ОСНОВНЫЕ КОМПОНЕНТЫ СТАТИСТИЧЕСКОЙ СРЕДЫ R
- •1.2.Работа с командной консолью интерфейса R
- •1.3.Работа с меню пакета R Commander
- •1.4.Объекты, пакеты, функции, устройства
- •2.ОПИСАНИЕ ЯЗЫКА R
- •2.3.Факторы
- •2.4.Списки и таблицы
- •2.5.Импортирование данных в R
- •2.6.Представление даты и времени; временные ряды
- •2.7.Организация вычислений: функции, ветвления, циклы
- •2.8.Векторизованные вычисления в R с использованием apply-функций
- •3.6.Категоризованные графики
- •4.ОПИСАТЕЛЬНАЯ СТАТИСТИКА И ПОДГОНКА РАСПРЕДЕЛЕНИЙ
- •4.2.Использование функций summary() и дополнительных пакетов
- •4.4.Заполнение пропущенных значений в таблицах данных
- •4.6.Законы распределения вероятностей, реализованные в R
- •5.КЛАССИЧЕСКИЕ МЕТОДЫ И КРИТЕРИИ СТАТИСТИКИ
- •5.1.Гипотеза о равенстве средних двух генеральных совокупностей
- •5.4.Гипотеза об однородности дисперсий
- •5.9.Оценка статистической мощности при сравнении долей
- •6.2.Линейные модели дисперсионного анализа
- •6.3.Структура модельных объектов дисперсионного анализа
- •6.4.Оценка адекватности модели дисперсионного анализа
- •6.8.Проблема множественных проверок статистических гипотез
- •7.4.Критерии выбора моделей оптимальной сложности
- •7.7.Процедуры диагностики моделей множественной регрессии
- •8.5.Ковариационный анализ
- •8.7.Индуктивные модели (метод группового учета аргументов)
- •9.2.Анализ пространственного размещения точек
- •9.4.Создание картограмм при помощи R
- •БИБЛИОГРАФИЯ И ИНТЕРНЕТ-РЕСУРСЫ
- •Основные литературные ссылки по тексту книги
- •Библиографический указатель литературы по использованию R
- •Основные Интернет-ресурсы

На полученном графике имеется несколько возможностей для визуализации зависимостей между различными переменными. Например, мы можем: а) выбрать для отображения необходимый период времениYear путем перемещения"слайдера" в
нижней части |
графика, б) раскрасить желаемым цветом "пузыри" на графике в |
соответствии с |
региономLocation, в) прикрепить названия фруктов к каждому |
"пузырю" (меню |
Select), г) изменить стиль графика "спузырей" на столбиковую |
диаграмму или линейную зависимость и т.д.
При помощи функций пакетаgoogleVis можно создавать и множество других типов графиков, а также объединять их на одной странице. Для ознакомления с имеющимися возможностями выполните командуdemo(googleVis). В частности, рассмотренный в этом разделе пример был заимствован из руководства пользователя пакета googleVis (goo.gl).
9.4.Создание картограмм при помощи R
Вэтом разделе мы покажем, как при помощи R можно создать картограммы
(англ. choropleth maps). На картограммах отдельные территориальные единицы залиты цветом, интенсивность которого соответствует величине отображаемой количественной переменной (плотность населения, уровень дохода, процент проголосовавших за определенного кандидата на выборах, и т.п.). Процедуру построения картограммы мы без комментариев использовали в разделе1.2, когда описывали приемы работы с командной консолью R. Теперь настало время объяснить все поподробнее.
Шейп-файлы
Основой для создания картограмм являются так называемые"шейп-файлы" (англ. shapefile) для разных административно-территориальных единиц страны. Шейп-файл представляет собой распространенный векторный формат хранения информации о
геометрическом |
положении |
и определенных атрибутах |
географических |
.объектов |
Несмотря на свое |
название, в |
действительности шейп-файл– это |
не один, а набор |
из |
375

нескольких файлов с одинаковым именем, но разными расширениями. Обязательными при этом являются файлы с расширениями.shp, .dbf и .shx. Мы не будем описывать здесь, что содержится в каждом из этих файлов, т.к. об этом можно найти много информации в Сети– см., например, статью в Википедии и официальное техническое описание формата на сайте esri.com. Для наших целей достаточным будет представление о шейп-файле как о файле, по данным из которого можно воспроизвести контурную карту страны и/или отдельных ее территориальных единиц.
Естественно, встает вопрос о том, где можно раздобыть шейп-файлы для той или иной интересующей нас территории? Одним из бесплатных(для некоммерческого использования) источников является "Глобальная база данных административных областей" (Global Administrative Areas, GADM). В этой базе данных доступны шейпфайлы трех разных уровней пространственного разрешения, например, на уровне страны, областей и районов.
Необходимые нам шейп-файлы можно получить на сайтеGADM двумя разными путями. Во-первых, мы можем сделать это "вручную", зайдя на сайт GADM и выполнив следующие шаги.
1.В главном меню сайта выбираем опциюDownload (отмечена стрелкой на рисунке ниже):
2.На открывшейся странице из выпадающих меню выбираем желаемую страну (Country) и формат скачиваемых файлов (File Format).
В |
меню File |
Format, как видно из рисунка ниже, доступны |
несколько опций, |
|
||||||
включая |
нужный |
нам шейп-файл(Shapefile). |
Обратите |
внимание: |
специалисты, |
|
||||
работающие |
над |
созданием |
и |
поддержкойGADM, |
отлично |
осведомлены |
о |
|||
распространенности и возможностяхR, и, как следствие, в качестве одной из опций в |
|
|||||||||
меню File Format мы видимR (SpatialPolygonsDataFrame) |
– файл "рабочего |
|
||||||||
пространства" (англ. |
workspace), |
который |
уже |
содержит |
шейп-файл |
в необходимом |
формате и может быть непосредственно загружен Rв. Описание того, как это сделать, приведено ниже. Пока же выберем опцию Shapefile:
3. Все последующие картограммы мы будем строить на примере Республики Беларусь.
На открывшейся странице увидим карту страны, под которой находится ссылка download для скачиванияzip-архива с нужными нам шейп-файлами для всех трех уровней пространственного разрешения. Сохраним этот архив (BLR_adm.zip) в удобном
для нас месте.
376

4. Разархивируем BLR_adm.zip в текущую рабочую папку R. В результате в этой папке появятся следующие файлы:
Все перечисленные файлы важны и должны находитьсяв одной директории. Обратите внимание на цифры в именах файлов – они помогают понять, какому уровню пространственного разрешения соответствует каждый файл. Так, файлы, в названии которых имеется 0, описывают контуры страны, 1 – контуры страны и областей, а 2 – контуры страны, областей и районов.
Для загрузки шейп-файлов в операционную средуR можно воспользоваться функцией readShapePoly() из пакета maptools. Так, шейп-файл для первого уровня
377

пространственного разрешения (страна, разделенная на области) можно загрузить следующим образом:
library(maptools)
Regions <- readShapePoly("BLR_adm1.shp")
Второй способ получения шейп-файлов с сайта GADM состоит в их загрузке по URL непосредственно из среды R. Обычно этот способ предпочтительнее и ниже будем предполагать, что им вы и воспользовались. Так, для загрузки шейп-файла с контурами страны и областей следует выполнить следующую команду:
load(url(" http://biogeo.ucdavis.edu/data/gadm2/R/BLR_adm1.RData"))
В результате в рабочей средеR появится объект с именемgadm. Во избежание путаницы в дальнейшем, стоит сохранить этот объект, присвоив ему какое-либо более описательное имя, например Regions, а исходный объект затем просто удалить:
Regions <- gadm rm(gadm)
С точки зрения своего внутреннего устройства и |
представленияR,в созданный |
|
нами объект Regions принадлежат |
к объектам классаS4 |
(подробнее об этом классе |
можно узнать на сайтеadv-r.had.co.nz |
– англ. яз.). Вкратце можно сказать, что такие |
|
объекты имеют сложную структуру, напоминающую структуру обычных списков R. |
||
Отдельные компоненты S4-объектов |
называются слотами |
(англ. slots) и могут сами |
являться сложными объектами любого другого класса. В отличие от обычных списков, обращение к слотамS4-объектов происходит при помощи оператора@, а не $. Кроме того, к слотам можно обращаться только по их именам, тогда как отдельные элементы списков мы можем индексировать также по их порядковым номерам. Имена слотов, входящих в составRegions, легко выяснить при помощи базовойR-функции slotNames():
slotNames(Regions)
[1] "data" "polygons" "plotOrder" "bbox" "proj4string"
Наибольший интерес для нас представляют слоты"data" и "polygons". Первый включает обычную таблицу данных (data frame), содержание которой станет понятным из приведенного ниже вывода команды Regions@data:
Regions@data
К сожалению, на многих компьютерах русскоязычные названия территориальных единиц не распознаются (отсюда знаки ??? в примере выше). В разделе 1.2 показано, что их легко можно откорректировать.
378
Всвою очередь, слот "polygons" содержит список с координатами точек,
задающих |
контуры соответствующих территориальных |
единиц в формате системы |
координат |
WGS84 (см. подробнее на ru.wikipedia.org), а |
также некоторые другие |
атрибуты: |
|
|
str(Regions@polygons) List of 6
$ :Formal class 'Polygons' [package "sp"] with 5 slots
.. ..@ Polygons :List of 1
.. .. ..$ :Formal class 'Polygon' [package "sp"] with 5 slots
.. .. .. .. ..@ labpt |
: |
num [1:2] 25.5 52.4 |
|
.. .. .. .. ..@ area |
: |
num |
4.3 |
.. .. .. .. ..@ hole |
: |
logi FALSE |
|
.. .. .. .. ..@ ringDir: |
int |
1 |
.. .. .. .. ..@ coords : num [1:2100, 1:2] 25.9 25.9 26 26 26 ...
.. ..@ plotOrder: |
int 1 |
|
.. ..@ labpt |
: |
num [1:2] 25.5 52.4 |
.. ..@ ID |
: |
chr "0" |
.. ..@ area |
: |
num 4.3 |
# остальная часть выведенной информации опущена для экономии места
Разобравшись со структурой шейп-файлов и их представлением R,в приступим собственно к построению картограмм. Как это часто случается, в R имеется несколько способов достижения одной и той же цели. Не являются исключением и картограммы.
Функция spplot() из пакета sp
Пакет sp содержит функции, реализующие ряд методов и классов для пространственных данных (импорт, преобразование и экспорт данных, графические методы и т..п). В частности, в нем имеется функцияspplot(), которая позволяет отображать на графике данные, заключенные в шейп-файле. В основе этой функции лежат высокоуровневые команды lattice – одного из популярных графических R-пакетов.
Для начала построим картограмму Беларуси, на которой каждая область будет залита своим цветом(цвет на этой карте будет служить просто для идентификации области – никакой другой информационной нагрузки он нести не будет). Посмотрим еще раз на названия областей, которые следуют по алфавиту(приведены оригинальные белорусские названия в написании латинскими буквами):
(Regions@data$NAME_1 <- factor(Regions@data$NAME_1))
[1] Brest Homyel' Hrodna Mahilyow Minsk Vitsyebsk
Levels: Brest Homyel' Hrodna Mahilyow Minsk Vitsyebsk
Переменная NAME_1, как видим, является фактором с6 уровнями. Каждому их этих уровней при построении карты необходимо будет присвоить уникальный цвет.
Хорошо отличимые друг от друга цвета можно подобрать , воспользовавшись одной из стандартных палитр R, например rainbow():
spplot(Regions, "NAME_1", # отображаемая переменная scales = list(draw = T), # отображение координатных осей
col.regions = rainbow(n = 6) ) # опция, задающая заливку цветом
379

|
|
rainbow(n = 6) |
|
|
56°N |
|
|
|
|
55°N |
|
|
|
|
|
|
|
|
Могилев |
54°N |
|
|
|
Минск |
|
|
|
Гродно |
|
|
|
|
|
|
|
|
|
|
Гомель |
|
|
|
|
Витебск |
53°N |
|
|
|
Брест |
|
|
|
|
|
52°N |
|
|
|
|
24°E |
26°E |
28°E |
30°E |
32°E |
Можно попробовать и другие стандартные R,палитрынапример terrain.colors() (см раздел 1.2) или heat.colors():
heat.colors (n=6)
56°N |
|
|
|
|
|
|
|
|
|
|
|
55°N |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Могилев |
|
|
54°N |
|
|
|
|
|
|
|
|
Минск |
|
|
|
|
|
|
|
|
|
|
Гродно |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Гомель |
|
|
|
|
|
|
|
|
|
|
|
Витебск |
|
|
53°N |
|
|
|
|
|
|
|
|
Брест |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
52°N |
|
|
|
|
|
|
|
|
|
|
|
|
24°E |
26°E |
28°E |
|
30°E |
32°E |
|
|
|
||
Можно также предложить к использованию |
хорошо |
подобранные |
и |
потому |
|||||||
приятные |
на |
вид |
палитры, входящие |
в |
состав |
|
пакетаRColorBrewer (см. |
|
|||
colorbrewer2.org). |
Помимо |
|
использования |
|
одной |
из |
палитрRColorBrewer, |
в |
|
||
|
|
|
|
|
|
|
|
|
380 |
|

приведенном примере также добавлена опцияpar.settings, при помощи которой отключаются координатные оси вокруг карты:
spplot(Regions, "NAME_1",
col.regions = brewer.pal(6, "Set3"), par.settings = list(axis.line = list(col = NA)))
Могилев
Минск
Гродно
Гомель
Витебск
Брест
Теперь придадим цвету смысл – построим картограмму, на которой цветовая шкала будет соответствовать числу мужчин, проживающих в каждой области. Данные взяты с сайта belstat.gov.by и представляют собой результаты переписи населения Беларуси за
2009 г. Значения численности мужчин достаточно добавить в таблицу , данных хранящуюся в слоте data объекта Regions (см. выше):
#Порядок чисел важен! Он должен совпадать с порядком,
#в котором в таблице data перечислены соответствующие области:
Regions@data$Population = c(186716, 152169, 131817,
105417, |
253427, |
135348) |
Перед построением картограммы нам |
необходимо |
определиться с цветовой |
шкалой, т.е. какими цветами шкала должна быть представлена и на сколько градаций разбита. Сделать это можно разными способами, в зависимости от стоящей задачи, а также от разброса значений отображаемой на картограмме переменной. Воспользуемся одним из таких способов– определением цветовой палитры при помощи базовойR-
функции colorRampPalette().
В качестве аргументов этой функции следует указать"опорные" цвета, между которыми требуется произвести интерполяцию(т.е. плавный переход, например, от красного к желтому). Функция colorRampPalette() возвращает другую функцию, которая и выполняет такую интерполяцию автоматически. Для нашего примера мы
381

создадим цветовую шкалу, в которой будет происходить плавный переход от цвета seagreen к whitesmoke (для ознакомления со списком стандартных цветовR выполните команду colors()):
mypalette <- colorRampPalette(c("seagreen", "whitesmoke"))
# Объект mypalette - это функция: mypalette
function (n)
{
x <- ramp(seq.int(0, 1, length.out = n))
rgb(x[, 1L], x[, 2L], x[, 3L], maxColorValue = 255)
}
Теперь функцию mypalette мы можем подать на вход функции spplot(). При этом в качестве(единственного) аргумента mypalette следует указать общее количество опорных плюс промежуточных цветов (n), которое должно присутствовать в шкале. Чем больше разброс значений отображаемой переменной, тем выше должно быть это число – так будет достигаться плавный переход между цветами. В нашем случае разброс значений численности мужчин в отдельных областях невелик, и поэтому выберем
n = 20. В приведенной ниже команде для демонстрации еще одной опции функции spplot() добавлен аргумент col со значением "transparent" (прозрачный) – с его помощью отключается отображение линий, ограничивающих каждую область:
spplot(Regions, "Population",
col.regions = mypalette(20), # определение цветовой шкалы col = "transparent", # отключение контурных линий на карте par.settings = list(axis.line = list(col = NA)))
Как видим, наибольшая численность мужчин в Беларуси имеет место в Минской области и в двух южных областях – Брестской и Гомельской.
Рассмотренный принцип добавления пользовательских данных в слотdata шейпфайла c последующим их отображением на картограмме можно применить и к более
382
дробным территориальным единицам– например, районам. Загрузим соответствующий шейп-файл с сайта GADM и сохраним его в виде объекта с именем Counties:
load(url( "http://biogeo.ucdavis.edu/data/gadm2/R/BLR_adm2.RData")) Counties <- gadm ; rm(gadm)
Вместо использования реальных данных, воспользуемся генератором случайных чисел и создадим вектор Fake из нормально распределенных значений. Этот вектор будет добавлен в слотdata объекта Counties. Длина вектора Fake будет соответствовать числу районов в Беларуси:
set.seed(1234) # для воспроизводимости результата
Counties@data$Fake <- rnorm(dim(Counties@data)[1], 100, 35)
Для создаваемой картограммы применим еще один способ определения цветовой шкалы. Пусть в основу этой шкалы лягут цвета из пакета RColorBrewer (см. выше), в частности из палитры RdBu.
При работе с количественными переменными возникает проблема с ,темчтобы разбить их значения на отдельные промежу, которымки можно сопоставить соответствующие цвета. В R такое разбиение не составляет труда, причем есть несколько способов это сделать. Мы воспользуется возможностями пакетаclassInt (не забудьте установить его перед первым использованием!). Функция classIntervals() разбивает имеющуюся совокупность чисел на классы с определенным шагом, задаваемым при помощи аргумента style. Мы постараемся разбить наш векторFake на 6 классов одинакового размера:
require(classInt)
brks.eq = classIntervals(Counties$Fake, n = 6,
style = "equal")
Вот результат разбиения этого вектора на 6 одинаковых классов:
brks.eq style: equal
one of 167,549,733 possible partitions of this variable into 6 classes
[17.90058,46.45293) [46.45293,75.00528) [75.00528,103.5576)
4 |
31 |
43 |
[103.5576,132.11) |
[132.11,160.6623) [160.6623,189.2147] |
|
24 |
11 |
5 |
#Задаем палитру из 6 цветов: plotcol <- brewer.pal(6,"RdBu")
#Рисуем карту:
spplot(Counties, "Fake", col.regions = plotcol,
at = brks.eq$brks, # задает границы классов par.settings = list(axis.line = list(col = NA)))
383

180
160
140
120
100
80
60
40
20
Создание картограмм при помощи пакета ggplot2
Пакет ggplot2 – пожалуй, самая популярная коллекция графических функций для R. Следует сразу оговориться, что синтаксис команд ggplot2 является своего рода мини-
языком |
программирования. |
Изложение основ ggplot2 не |
является целью данного |
|
раздела – для |
этого существуют соответствующие руководства, из которых особое |
|||
внимание |
стоит |
обратить |
на официальную документацию |
пакета(docs.ggplot2.org), а |
также на книги(Wickham, 2009; Chang, 2013). В приведенных ниже примерах даются лишь краткие пояснения к коду, необходимые для его понимания.
Напомним, что выше мы загрузили шейп, необходимый-файл для административно-территориальных единиц Беларуси на уровне районов и создали объект Counties, который относится к объектам классаS4. Единственный формат данных, который принимают функции пакетаggplot2, – это "таблица данных" (data frame). Соответственно, нам необходимо каким-то образом преобразовать объектCounties в таблицу данных. Сделать это позволяет функция fortify():
library(ggplot2); library(rgeos); library(maptools) counties <- fortify(Counties, region = "NAME_2")
#аргумент region = "NAME_2" указывает на переменную (NAME_2)
#с идентификаторами # административных единиц - районов
str(counties) |
|
obs. of |
7 variables: |
|||
'data.frame': 42659 |
||||||
$ |
long : num |
29.1 |
29.1 |
29.1 |
29.1 |
29.1 ... |
$ |
lat : num |
52.9 |
52.9 |
52.9 |
52.9 |
52.8 ... |
$ |
order: int |
1 2 3 4 5 6 7 8 9 |
10 ... |
|
$ |
hole : logi |
FALSE FALSE |
FALSE FALSE FALSE FALSE ... |
|
$ |
piece: Factor w/ 1 level |
"1": |
1 1 1 1 1 1 1 1 1 1 ... |
|
$ |
group: Factor w/ 118 levels "Aktsyabar.1",..: 1 1 1 1 1 1 1 1 1 1 |
|||
$ |
id : chr "Aktsyabar" "Aktsyabar" "Aktsyabar" "Aktsyabar" ... |
384
Теперь мы можем построить прототип нашей будущей картограммы при помощи следующей составной команды:
ggplot() + geom_map(data = counties, aes(map_id = id),
map = counties, color = "gray70") + expand_limits(x = counties$long, y = counties$lat) + coord_map("polyconic")
Создание статистических графиков средствамиggplot2 напоминает послойное создание изображений в программеAdobe Photoshop: вначале создается пустой слой графика, поверх которого далее добавляются другие слои, содержащие определенные графические элементы (в частности, изображение карты). Рассмотрим отдельные части приведенной выше команды подробнее:
°ggplot(): инициирует создание пустого слоя.
°geom_map(): создает слой с картой, внешний вид которой задается при помощи соответствующих аргументов. Так, при помощи аргумента data мы указываем таблицу данных, в которой содержатся подлежащие отображению на карте данные. Поскольку на первом этапе никаких таких данных у нас нет, в качестве "заглушки" мы просто укажем таблицу counties. Аргумент aes() позволяет настроить"эстетические параметры" (англ. aesthetics) создаваемого слоя, и, в частности, указать, какая переменная в таблице с
данными |
содержит |
идентификаторы |
административно-территориальных |
единиц |
(районов). Аргумент map |
служит для |
указания таблицы, содержащей координаты |
|
|
соответствующих полигонов на карте (в нашем случае это counties – таблица, которую |
|
|||
мы создали при помощи функции fortify() из объекта Counties. |
|
°expand_limits(): в отличие от других функцийggplot2, которые
предназначены для |
создания новых |
слоев с |
графическими |
элементами, функция |
|
||||
geom_map() не способна автоматически определять оптимальные пределы значений x- и |
|
||||||||
y-координат. Сделать это ей помогает функция expand_limits(). |
|
|
|
|
|||||
° coord_map(): задает |
тип картографической проекции(см. подробнее на |
сайте |
|
||||||
goo.gl). В |
приведенном примере использован тип"polyconic" |
– |
поликоническая |
|
|||||
проекция. |
Доступны |
также |
многие другие типы, реализованные |
в |
пакетеmapproj |
|
|||
(подробнее см. справочный файл, доступный по команде ?mapproject). |
|
|
|
||||||
Для |
иллюстрации |
принципа |
создания |
картограмм |
добавим |
к |
структур |
Counties@data столбец fake_data$Value со случайно сгенерированными данными для каждого района Беларуси:
fake_data <- as.data.frame(Counties@data) fake_data$Value <- rnorm(nrow(fake_data))
Теперь отобразим данные из столбца Value таблицы fake_data на картограмме:
ggplot() + geom_map(data = fake_data,
aes(map_id = NAME_2, fill = Value), map = counties) +
expand_limits(x = counties$long, y = counties$lat) + coord_map("polyconic")
Результатом приведенной команды будет картограмма с автоматически выбранной цветовой шкалой:
385

Может возникнуть необходимость изменить эту цветовую шкалу. Так, в рассматриваемом примере отображаемые на карте данные имеют среднее значение0. Имеет смысл определенным образом выделить это значение на цветовой шкале, например, при помощи белого цвета. Для значений же, отклоняющихся от 0 в отрицательную и в положительную стороны, можно выбрать, например, оттенки синего и красного соответственно.
Для создания подобных расходящихся(англ. diverging) цветовых шкал в пакете ggplot2 служит функцияscale_fill_gradient2(), которая работает примерно следующим образом:
library(scales) # для функции muted (см. ниже) ggplot() + geom_map(data = fake_data,
aes(map_id = NAME_2, fill = Value), colour = "gray",
map = counties) +
expand_limits(x = counties$long, y = counties$lat) + scale_fill_gradient2(low = muted("blue"),
midpoint = 0, mid = "white",
high = muted("red"),
limits = c(min(fake_data$Value), max(fake_data$Value))) +
coord_map("polyconic")
386

Обратите внимание на аргумент colour = "gray" функции geom_map()– он добавлен для обводки границ районов серым цветом.
При необходимости мы можем выполнить тонкую настройку и других деталей внешнего вида графика. В частности, при помощи функцииtheme() ("тема", или "шаблон") можно отключить отображение серого фона, координатной сетки, а также осей и их подписей:
ggplot() + geom_map(data = fake_data,
aes(map_id = NAME_2, fill = Value), colour = "gray",
map = counties) +
expand_limits(x = counties$long, y = counties$lat) + scale_fill_gradient2(low = muted("blue"),
midpoint = 0, mid = "white",
high = muted("red"),
limits = c(min(fake_data$Value), max(fake_data$Value))) +
coord_map("polyconic") + theme(
axis.line = element_blank(), axis.text.x = element_blank(), axis.text.y = element_blank(), axis.ticks = element_blank(), axis.title.x = element_blank(), axis.title.y = element_blank(), plot.background = element_blank(), panel.grid.major = element_blank(), panel.grid.minor = element_blank(), panel.border = element_blank(), panel.background = element_blank() )
387