Проблема при построении графика на карте с использованием highcharter - PullRequest
1 голос
/ 06 февраля 2020

У меня проблемы с попыткой написать R-код для хороплета с использованием пакета highcharter. Я пытаюсь повторить код в следующей ссылке в строках 84-112: https://www.kaggle.com/gloriousc/global-terrorism-in-1970-2016/code. Я столкнулся с 2 ошибками:

  1. При выполнении строки 95 ошибка говорит, что нет объекта с именем "countrycode_data". Я посмотрел на inte rnet, чтобы узнать, что такое countrycode_data, и обнаружил, что это набор данных, содержащий код страны, который нужно связать с названиями стран в наборах данных. Countrycode_data, насколько я понял, должно было содержаться в пакете «код страны», который я установил, но мне не удалось выяснить, как получить доступ к этому набору данных. Чтобы преодолеть эту проблему, я скачал этот набор данных из inte rnet и сумел go включить с кодом.

  2. При запуске кода choroplet, начиная со строки 103, я обнаружена следующая ошибка: «Ошибка: %in% (x = tail (joinBy, 1), table = names (df)) не TRUE». На самом деле я понятия не имею, что может означать эта ошибка, поэтому я прошу помощи.

Мне удалось преодолеть проблему с первой ошибкой, хотя я не уверен, что это правильный путь.

Я собираюсь оставить здесь весь код:

knitr::opts_chunk$set(echo=TRUE, error=FALSE)
library(dplyr) #manipulate table
library(ggplot2) #visualization
library(highcharter) #making map
library("viridisLite") #Default Color Maps
library(countrycode) #list of country code
library(treemap) #make a treemap chart
library(reshape2) #melt function
library(plotly) #pie chart
library(tm) #text mining
library(SnowballC) #stemming text
library(wordcloud) #make a text chart
library(RColorBrewer) #make a color pallette
library(DT) #make datatable

#input the data
terror <- read.csv("../input/globalterrorismdb_0617dist.csv")

Карта террористических актов

#count terrorism incidents per country as a dataframe
countries <- terror %>% 
                group_by(country_txt) %>% 
                summarise(Total = round(n()))

#Making a terrorism map
#Credit to umeshnarayanappa
names(countries) <- c("country.name", "total") #change the column name

countries$iso3 <- countrycode_data[match(countries$country.name, countrycode_data$country.name.en), "iso3c"] #add iso3 column from country_code

data(worldgeojson, package = "highcharter")

dshmstops <- data.frame(q = c(0, exp(1:5)/exp(5)),
                        c = substring(viridis(5 + 1, option = "D"), 0, 7)) %>%  #from viridisLite, make a color
                list_parse2() #from highchart package, parse df to list

highchart() %>% #from highchart package
  hc_add_series_map(worldgeojson, countries, value = "total", joinBy = "iso3") %>% 
  hc_colorAxis(stops = dshmstops) %>% 
  hc_legend(enabled = TRUE) %>% 
  hc_add_theme(hc_theme_db()) %>% 
  hc_mapNavigation(enabled = TRUE) %>%
  hc_title(text = "Global Terrorism in 1970-2016", style = list(fontSize = "25px")) %>%
  hc_add_theme(hc_theme_google()) %>%
  hc_credits(enabled = TRUE, text = "Sources: National Consortium for the Study of Terrorism and Responses to Terrorism (START)", style = list(fontSize = "10px")) 

Я хочу указать, что , хотя я ctrl + c ctrl + v строки, они не работают для меня.

Спасибо, что прочитали все, а также, я надеюсь, за вашу помощь.

1 Ответ

1 голос
/ 06 февраля 2020

Я попытался повторить пример. Я надеюсь, что вам достаточно следующего, чтобы поработать самостоятельно и повторить пример. Кажется, что countrycode_data находится в пакете psData. Для этого пакета требуется пакет r Java, которого сейчас нет на моей машине. Пока вы искали обходной путь, я нашел свой путь; Я собираю данные по стране, включая iso3. (Возможно, вы также можете использовать пакет ISO-кодов.) Необходимо проверить, идентичны ли названия стран в двух наборах данных, что является распространенной проблемой. Вы обычно видите некоторые несоответствия. У меня нет времени, чтобы исправить все, но я показал вам, как изменить названия некоторых стран в recode(). Суть в том, что вы хотите добавить iso3 к countries. Поэтому вам необходимо убедиться, что у вас одинаковые названия стран. (Очевидно, что некоторые страны больше не существуют. Вы не можете ничего с ними поделать.) Автор использовал match() в своем коде, но я скорее использовал left_join(), чтобы сделать то же самое. После этого, я думаю, вы готовы следовать остальной части кода. Обратите внимание, что hc_add_series_map() также выполняет процесс соединения. worldgeojson имеет свойство под названием iso3. countries должен иметь столбец с именем iso3. В противном случае вы снова получите то же сообщение об ошибке.

library(tidyverse)
library(data.table)
library(rvest)
library(highcharter)
library(viridisLite)

# I used fread(). This is much faster.
terror <- fread("globalterrorismdb_0919dist.csv")

# I wrote my own code which does the same job.
count(terror, country_txt) %>% 
setNames(nm = c("country.name", "total")) -> countries 


# Get iso3 data
map_dfc(.x = c("official", "shortname", "iso3"),
        .f = function(x) {read_html("http://www.fao.org/countryprofiles/iso3list/en/") %>% 
                          html_nodes(paste("td.", x, sep = "")) %>% 
                          html_text() %>% 
                          gsub(pattern = "\\n(\\s+)?", replacement = "")}) %>% 
setNames(nm = c("official", "shortname", "iso3")) -> iso3

# Revise some country names.
mutate(iso3, shortname = trimws(sub(x = shortname, pattern = "\\(.*\\)",
                                replacement = "")),
       shortname = recode(.x = shortname,
                          `Bosnia and Herzegovina` = "Bosnia-Herzegovina",
                          `Brunei Darussalam` = "Brunei",
                          Czechia = "Czech Republic",
                          Congo = "Republic of the Congo",
                          `Côte d'Ivoire` = "Ivory Coast",
                          `Russian Federation` = "Russia",
                          `United Kingdom of Great Britain and Northern Ireland` = "United Kingdom",
                          `United States of America`= "United States"
                          )) -> iso3


# Join the two data sets

left_join(countries, iso3, by = c("country.name" = "shortname")) -> countries

data(worldgeojson, package = "highcharter")

dshmstops <- data.frame(q = c(0, exp(1:5)/exp(5)),
                        c = substring(viridis(5 + 1, option = "D"), 0, 7)) %>%  #from viridisLite, make a color
             list_parse2()

highchart() %>% #from highchart package
hc_add_series_map(worldgeojson, df = countries,
                  value = "total", joinBy = "iso3") %>% 
hc_colorAxis(stops = dshmstops) %>% 
hc_legend(enabled = TRUE) %>% 
hc_add_theme(hc_theme_db()) %>% 
hc_mapNavigation(enabled = TRUE) %>%
hc_title(text = "Global Terrorism in 1970-2016", style = list(fontSize = "25px")) %>%
hc_add_theme(hc_theme_google()) %>%
hc_credits(enabled = TRUE,
           text = "Sources: National Consortium for the Study of Terrorism and Responses to Terrorism (START)",
           style = list(fontSize = "10px"))

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...