2016-01-25 2 views
2

Я хотел бы создать условный микроканал с использованием R. В принципе, я хотел бы создать фасет (макет сетки) для четырех разных переменных в примере ниже p_1, p_2, q_1, q_2) и отобразить каждую карту состояний с цветным кодом 1 для синего и 0 для зеленого.Визуализация данных: Карты с использованием ggplot2 и фасетного макета

Ниже приведен пример кода. Данные, которые должны использоваться для цветового кодирования, это «mydata», 0 для зеленого и 1 для удара по каждой переменной p_1, p_2, q_1, q_2. Как бы это сделать при использовании ggplot.

library(ggplot2) 
library(maps) 
library(scales) # for function alpha() 
us.dat <- map_data("state") 

ggplot(us.dat, aes(x=long, y=lat, group=group)) + geom_polygon(fill="grey65", colour = alpha("white", 1/2), size = 0.2) + 
    theme_bw() + theme(legend.position = "none", text = element_blank(), line = element_blank()) + coord_map("polyconic") 

# create random data 

states <- unique(us.dat$region) 
p_1 <- sample(0:1,49,replace=T) 
p_2 <- sample(0:1,49,replace = T) 
q_1 <- sample(0:1,49,replace=T) 
q_2 <- sample(0:1,49,replace = T) 

mydata <- as.data.frame(t(rbind(states,p_1,p_2,q_1,q_2))) 

Ниже представлен график, который я хотел бы выполнить с помощью одной общей легенды. enter image description here

ответ

3

Необходимо переформатировать свои данные так, чтобы они были в длинном формате с переменными, идентифицируемыми ключом. Затем вам необходимо объединить его с пространственными данными. Затем используйте facet_wrap(~ key) для создания четырех панелей.

Попробуйте это:

library(dplyr) 
library(tidyr) 
us.dat %>% 
    dplyr::left_join(
    mydata %>% 
     tidyr::gather(key, value, -states), 
    by = c("region" = "states") 
) %>% 
    ggplot(aes(x=long, y=lat)) + 
    geom_polygon(aes(group=group, fill = value), 
       colour = alpha("white", 1/2), 
       size = 0.2) + 
    theme_bw() + 
    theme(# legend.position = "none", 
     line = element_blank(), 
     axis.text = element_blank(), 
     axis.title = element_blank(), 
     strip.background = element_blank(), 
     panel.border = element_blank() 
     ) + 
    coord_map("polyconic") + 
    facet_wrap(~ key) 

Я добавил несколько элементов темы, чтобы заставить его выглядеть так, что вы хотите. Чтобы получить нужные цвета, вам необходимо использовать scale_fill_manual().

+1

Пользователь задал одну общую легенду, изменив 'legend.position =" none "' на 'legend.position =" top "'? – bouncyball

+0

Правильно, я пропустил эту часть вопроса. С 'facet_wrap' создается только одна легенда. Я отредактировал ответ, чтобы прокомментировать аргумент 'legend.position'. –

+0

Большое спасибо, именно то, что я искал. Я получаю следующую ошибку, когда я присоединяюсь к таблице с помощью вашего фрагмента, {Предупреждающее сообщение: В left_join_impl (x, y, by $ x, by $ y): Соединительный фактор и вектор символов, коэрцитирующий в вектор символов}, не уверен почему, поскольку оба государства и регион являются символами. Из того, что я вижу, вы присоединились к двум таблицам, чтобы правильно создать длинный формат? Пожалуйста, дайте мне знать. Спасибо – forecaster

 Смежные вопросы

  • Нет связанных вопросов^_^