Значение присваивается не той стране с помощью Leaflet и Maps - PullRequest
0 голосов
/ 13 января 2019

Я пытаюсь построить европейские страны, используя буклет, но значения, присвоенные странам, неверны. Цель состоит в том, чтобы создать картографическую карту Европы, в которой каждой стране присвоено определенное значение. Я использовал образец исходного набора данных, и на рисунке «Текущий результат» видно, что Швеция получает значение Германии. Как я могу присвоить правильное значение правильному GEO (страна)

require(shiny)
require(leaflet)
require(htmltools)
require(ggplot2)
require(highcharter)
require(maps)
require(dplyr)

rm(list = ls())

df <- data.frame(GEO = c("Belgium", "Germany" , 
"France","Italy","Sweden","Slovakia" ),
             PRODUCT = c("Total petroleum products"),
             TIME = c(1990),
             Value = c(18345, 126544, 88659,90069,14670,4974), 
stringsAsFactors = FALSE)

ui <- fluidPage(
  titlePanel("Energy consumption in Europe"),
  tabsetPanel(
    tabPanel("Map overview", sidebarLayout(
      sidebarPanel(selectInput("Type", "Select Type", choices = 
unique(df$PRODUCT), selected = ""), 
               selectInput("Year", "Select Year", choices = 
unique(df$TIME), selected = "")),
      mainPanel(leafletOutput("firstMap", height = 800)
      )))
  )
)

server <- function(input, output) {

  output$firstMap <- renderLeaflet({

    df_tmp1<-reactive({
      subset(df, df$PRODUCT==input$Type & df$TIME==input$Year)
    })

    df_tmp <-df_tmp1()

    bounds <- map("world", unique(df_tmp$GEO), fill = TRUE, plot = FALSE)
    bounds$Value <- df_tmp$Value
    pal <- colorNumeric("Blues", df$Value)

    leaflet(bounds)%>%
      addTiles()%>%
      addPolygons(stroke = TRUE,
                  smoothFactor = 0.5,
                  fillOpacity=0.8,
                  fillColor = ~pal(df_tmp$Value),
                  color = "black",
                  opacity = 0.7,
                  weight = 1,
                  popup = paste(bounds$names, "<br>", "Value: ", 
df_tmp$Value, "KTOE"
              )
      )%>%
      addLegend("topright", pal = pal, values = df$Value,
                title = "Consumption in KTOE",
                labels = c(min(df$Value), max(df$Value)),
                opacity = 0.6
      )
  })

}


shinyApp(ui, server)

Токовый выход

Что мне здесь не хватает?

1 Ответ

0 голосов
/ 15 января 2019

Это происходит из-за упорядочения стран, которые вы считаете само собой разумеющимися.

bounds <- map("world", unique(df_tmp$GEO), fill = TRUE, plot = FALSE)

вернет требуемые полигоны, но не обязательно в том же порядке. Кроме того, если страна состоит из нескольких полигонов (например, во Франции также есть «Франция: Корсика»), это также усложнит ваши данные. Так просто настройка

bounds$Value <- df_tmp$Value

действительно даст довольно случайные результаты. Вы должны убедиться, что вы подбираете правильное значение с правильным полигоном (ами). Итак, сначала вы должны извлечь названия стран без дополнений из границ:

bounds$country <- vapply(strsplit(bounds$name, ":"), function(x) x[1], FUN.VALUE="a")

Теперь вы можете указать правильные значения для каждой записи:

bounds$Value <- df_tmp$Value[match(bounds$country, df_tmp$GEO)]
...