2016-11-29 2 views
2

Я пытаюсь использовать оболочку highcharts highcharter в R, чтобы создать серию карт. Карты, которые отображают цвет состояния или страны для непрерывной переменной, работают красиво, однако у меня возникают некоторые проблемы с отображением цвета состояния непрерывной переменной. (В принципе, мне бы хотелось, чтобы он выглядел примерно как this).Карта Highcharter с категориальными переменными в R

Я пробовал все, о чем я могу думать, и ничего не работает. Вот пример с фиктивными данными. Предположим, что я хочу показать состояния категории A как красные, категория B - желтые, а категория C - синие.

library("dplyr") 
library('highcharter') 
library("viridisLite") 

data(usgeojson) 

## Create data frame with letter categories, numerical categories, and state abbreviations 

categories <- c("A", "A", "A", "A", "A", "A", "C", "A", "A", "A", "A", "A", 
"A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "C", "A", "A", "A", "B", 
"B", "B", "B", "B", "C", "B", "B", "B", "B", "B", "B", "B", "B", "B", "B", 
"B", "B", "B", "C", "B", "B", "B", "B") 

states <- c("AL", "AK", "AZ", "AR", "CA", "CO", "CT", "DE", "FL", "GA", "HI", 
"ID", "IL", "IN", "IA", "KS", "KY", "LA", "ME", "MD", "MA", "MI", "MN", "MS", 
"MO", "MT", "NE", "NV", "NH", "NJ", "NM", "NY", "NC", "ND", "OH", "OK", "OR", 
"PA", "RI", "SC", "SD", "TN", "TX", "UT", "VT", "VA", "WA", "WV", "WI", "WY") 

numbers <- c("1", "1", "1", "1", "1", "1", "3", "1", "1", "1", "1", "1", "1", 
"1", "1", "1", "1", "1", "1", "1", "1", "1", "3", "1", "1", "1", "2", "2", 
"2", "2", "2", "3", "2", "2", "2", "2", "2", "2", "2", "2", "2", "2", "2", 
"2", "2", "3", "2", "2", "2", "2") 

data <- data.frame(categories, states, numbers) 

## Convert abbreviations to state names for highcharter 
data$state_full <- state.name[match(data$state, state.abb)] 

## If we plot these data using the numerical categories, the colors are on a scale 
highchart(type = "map") %>% 
hc_add_series_map(map = usgeojson, 
       df = data, 
       joinBy = c("woename", "state_full"), 
       value = "numbers") 

## Plotting by adding each category individually ends up with the each new map 
## overwriting the ones before it. 

cat_A <- data[data$categories == "A", ] 
cat_B <- data[data$categories == "B", ] 
cat_C <- data[data$categories == "C", ] 

highchart(type = "map") %>% 
hc_add_series_map(map = usgeojson, 
       df = cat_A, 
       joinBy = c("woename", "state_full"), 
       value = "numbers") %>% 
hc_add_series_map(map = usgeojson, 
       df = cat_B, 
       joinBy = c("woename", "state_full"), 
       value = "numbers") %>% 
hc_add_series_map(map = usgeojson, 
       df = cat_C, 
       joinBy = c("woename", "state_full"), 
       value = "numbers") 

Это явно может работать в высоких диаграммах, но я не могу заставить его работать в highcharter.

Любой ввод очень ценится.

Спасибо!

+0

Интересно - не связаны, но когда я запускаю это я теперь получаю ошибку, что объект ' 'usgeojson' не found'. Протестировано против других моих проектов с картами карт высокой чарты, и они также терпят неудачу. Ах, я толкнул его. Загрузка карт сейчас. Но да, они все еще монохроматичны. – wergeld

+0

О! Извини за это! Я отредактировал сценарий и добавил необходимый вызов 'data (usgeojson)'. –

ответ

0

Государства из третьей серии, у которых нет данных, отображаются как серые состояния и находятся над данными предыдущих серий. Вы можете установить allAreas на false, чтобы предотвратить это.

Дополнительно colorAxis должен получить максимальную настройку, поскольку он автоматически рассчитывается только для первой серии - the issue reported.

Рабочий код (для запуска после кода - после того, как категории установлены):

highchart(type = "map") %>% 
hc_plotOptions(series = list(allAreas = F)) %>% 
hc_colorAxis(max = 3) %>% 
hc_add_series_map(map = usgeojson, 
       df = cat_A, 
       joinBy = c("woename", "state_full"), 
       value = "numbers") %>% 
hc_add_series_map(map = usgeojson, 
       df = cat_B, 
       joinBy = c("woename", "state_full"), 
       value = "numbers") %>% 
hc_add_series_map(map = usgeojson, 
       df = cat_C, 
       joinBy = c("woename", "state_full"), 
       value = "numbers") 
0

Вам просто нужно повторить пример, который вы хотите.

cat_A <- data %>% filter(categories == "A") 
cat_B <- data %>% filter(categories == "B") 
cat_C <- data %>% filter(categories == "C") 

map <- download_map_data("countries/us/us-all") 

hc <- highchart(type = "map") %>% 
    hc_plotOptions(map = list(
    allAreas = FALSE, 
    joinBy = c("hc-a2", "states"), 
    mapData = map 
)) %>% 
    hc_add_series(name = "A", data = cat_A, color = "#A1A1A1") %>% 
    hc_add_series(name = "B", data = cat_B, color = "#46BEC8") %>% 
    hc_add_series(name = "C", data = cat_C, color = "#0000CD") 

hc 

Другая альтернатива:

series <- data %>% 
    group_by(name = categories) %>% 
    do(data = list_parse(select(., states))) %>% 
    ungroup() %>% 
    mutate(color = c("red", "darkred", "pink")) 

series 

highchart(type = "map") %>% 
    hc_plotOptions(map = list(
    allAreas = FALSE, 
    joinBy = c("hc-a2", "states"), 
    mapData = map 
)) %>% 
    hc_add_series_list(series) 

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

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