R: ggplot2 с geom_map возвращает x, а единицы измерения должны иметь длину > 0 ошибок, несмотря на то, что значения преобразованы в коэффициенты.

Я работаю над примитивным блестящим приложением, которое будет отображать некоторые данные из проекта Открытые данные для Шотландии. Я разработал запросы SPARQL, которые создают фрейм данных, похожий на приведенный ниже отрывок.

dz_label overall.quantiles
S010001 8
S010002 9

У меня есть укрепленные шейп-файлы, и я пытаюсь сопоставить их с помощью следующего кода:

ggplot() + 
      geom_map(data = dta.simd, aes(map_id = dz_label, 
                                    fill = as.factor(dta.simd$overall.quantiles)), 
               map = shps.dzs2001) +
      geom_path(data = shps.dzs2001, aes(x=long, y=lat, group=group), 
                colour="black", size=0.25)

Код возвращает ошибку

Error: 'x' and 'units' must have length > 0

Если я понимаю подобные обсуждения (1, 2), проблема связана с классами значений. Однако я понимаю, что as.factor() должен решить эту проблему, но, очевидно, это не так. Полный код приложения приведен ниже. Естественно, буду признателен за любую помощь.

Сервер

# Libs
require(shiny); require(SPARQL); require(ggplot2); require(rgeos); require(maptools);
require(RCurl)

# Server function
shinyServer(function(input, output) {

  # Source the data

  ## Source the SPARQL data
  ### Define endpoint URL.
  endpoint <- "http://data.opendatascotland.org/sparql.csv"

  ### Create Query and download table for the SIMD rank
  query.simd <- "PREFIX stats: <http://statistics.data.gov.uk/id/statistical-geography/>
      PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
      PREFIX simd: <http://data.opendatascotland.org/def/simd/>
      PREFIX cube: <http://purl.org/linked-data/cube#>
      PREFIX stats_dim: <http://data.opendatascotland.org/def/statistical-dimensions/>
      PREFIX year: <http://reference.data.gov.uk/id/year/>

      SELECT DISTINCT
      ?dz_label
      ?overall_rank
      ?income_deprivation_rank
      ?employment_deprivation_rank
      ?health_deprivation_rank
      ?education_deprivation_rank
      ?access_deprivation_rank
      ?housing_deprivation_rank
      ?crime_deprivation_rank

      WHERE {

      GRAPH <http://data.opendatascotland.org/graph/simd/rank> {
      ?overall_rank_observation stats_dim:refArea ?dz .
      ?overall_rank_observation stats_dim:refPeriod year:2012 .
      ?overall_rank_observation simd:rank ?overall_rank .
      }

      GRAPH <http://data.opendatascotland.org/graph/simd/income-rank> {
      ?income_rank_observation stats_dim:refArea ?dz .
      ?income_rank_observation stats_dim:refPeriod year:2012 .
      ?income_rank_observation simd:incomeRank ?income_deprivation_rank .
      }

      GRAPH <http://data.opendatascotland.org/graph/simd/employment-rank> {
      ?employment_rank_observation stats_dim:refArea ?dz .
      ?employment_rank_observation stats_dim:refPeriod year:2012 .
      ?employment_rank_observation simd:employmentRank ?employment_deprivation_rank .
      }

      GRAPH <http://data.opendatascotland.org/graph/simd/health-rank> {
      ?health_rank_observation stats_dim:refArea ?dz .
      ?health_rank_observation stats_dim:refPeriod year:2012 .
      ?health_rank_observation simd:healthRank ?health_deprivation_rank .
      }

      GRAPH <http://data.opendatascotland.org/graph/simd/education-rank> {
      ?education_rank_observation stats_dim:refArea ?dz .
      ?education_rank_observation stats_dim:refPeriod year:2012 .
      ?education_rank_observation simd:educationRank ?education_deprivation_rank .
      }

      GRAPH <http://data.opendatascotland.org/graph/simd/geographic-access-rank> {
      ?access_rank_observation stats_dim:refArea ?dz .
      ?access_rank_observation stats_dim:refPeriod year:2012 .
      ?access_rank_observation simd:geographicAccessRank ?access_deprivation_rank .
      }

      GRAPH <http://data.opendatascotland.org/graph/simd/housing-rank> {
      ?housing_rank_observation stats_dim:refArea ?dz .
      ?housing_rank_observation stats_dim:refPeriod year:2012 .
      ?housing_rank_observation simd:housingRank ?housing_deprivation_rank .
      }

      GRAPH <http://data.opendatascotland.org/graph/simd/crime-rank> {
      ?crime_rank_observation stats_dim:refArea ?dz .
      ?crime_rank_observation stats_dim:refPeriod year:2012 .
      ?crime_rank_observation simd:crimeRank ?crime_deprivation_rank .
      }

    {
      SELECT ?dz ?dz_label WHERE
    {
      ?dz a <http://data.opendatascotland.org/def/geography/DataZone> .
      ?dz rdfs:label ?dz_label .
    }
    }
  }"

  ## Make the data table for SIMD
  dta.simd <- SPARQL(url = endpoint, query = query.simd, format = "csv")$results
  ### Clean the data frame
  dta.simd$dz_label <- gsub("Data Zone","", dta.simd$dz_label)

  # Readings shapefiles (pass only file that ends with shp)
  shps.dzs2001 <- readShapeSpatial("data/SG_DataZone_Bdry_2001.shp")

  ## Read shapefiles
  shps.dzs2001 <- fortify(shps.dzs2001, region= "DZ_CODE")

  # Switch on the gclibpermit
  gpclibPermit()

  # Make the plot
  output$distPlot <- renderPlot({

    ### Get the column index fumber
    col.ind <- match(input$firstvar, colnames(dta.simd))


    #### Calculate the breaks 
    ##### Take tha quantilies value from the UI
    ##### Obtain the breaks
    dta.simd$column <- as.numeric(as.character(dta.simd[,col.ind]))
    dta.simd$overall.quantiles <- ceiling(sapply(dta.simd$column,function(x) 
      sum(x-dta.simd$column>=0))/(length(dta.simd$column)/input$quannum))

    #### Graph the chart
    ggplot() + 
      geom_map(data = dta.simd, aes(map_id = dz_label, 
                                    fill = as.factor(dta.simd$overall.quantiles)), 
               map = shps.dzs2001) +
      geom_path(data = shps.dzs2001, aes(x=long, y=lat, group=group), 
                colour="black", size=0.25)

    ### Re-calculate summary stats
    summary.data <- head(dta.simd)

  })
  ### Do the summary tables
  output$summary.table <- renderDataTable({summary.data})
})

Интерфейс

require(shiny)

# Define list of options
choices.list <- list("Overall Rank" = "overall_rank", 
                     "Income" = "income_deprivation_rank",
                     "Employment" = "employment_deprivation_rank",
                     "Health" = "health_deprivation_rank",
                     "Education" = "education_deprivation_rank",
                     "Access to Services" = "access_deprivation_rank",
                     "Housing" = "housing_deprivation_rank",
                     "Crime" = "crime_deprivation_rank"
                     )

# Define UI for application that draws a histogram
shinyUI(fluidPage(

  # Application title
  titlePanel("Scottish Index of Multiple Deprivation 2012"),

  # Sidebar with a slider input for the number of bins
  sidebarLayout(
    sidebarPanel(
      selectInput(inputId = "firstvar", 
                  label = "Index domain to map",
                  choices = choices.list, 
                  selected = "income_deprivation_rank"),
      sliderInput("quannum", label = "Number of quantiles", 
                  min = 0, 
                  max = 100, 
                  value = 10)),

    # Show a plot of the generated distribution
    mainPanel(
      plotOutput("distPlot", height = "700px"),
      dataTableOutput("summary.data"),
      h5("Notes"),
      p("The data is sourced live from the Open Data for Scotland Project. The shapefiles are sourced from the Scottish Neighbourhood Statistics.")
    )
  )
))

person Konrad    schedule 09.12.2014    source источник
comment
Не могли бы вы сделать это минимальным примером? Конечно, вы можете воспроизвести проблему с небольшой выборкой данных, а не с блестящим приложением.   -  person Gregor Thomas    schedule 10.12.2014
comment
Тем не менее, можно попробовать удалить имя фрейма данных изнутри aes(). Сделайте свой fill = as.factor(overall.quantiles) или преобразуйте столбец в коэффициент перед построением графика.   -  person Gregor Thomas    schedule 10.12.2014
comment
Грегор, спасибо за проявленный интерес. Моя идея заключалась в том, что начальные два абзаца будут близки к минимальному примеру, но я решил опубликовать все это, просто чтобы предоставить больше информации.   -  person Konrad    schedule 10.12.2014
comment
Просто чтобы добавить, fill = as.factor(overall.quantiles) вернул ту же ошибку.   -  person Konrad    schedule 10.12.2014
comment
Первые два абзаца — хорошая идея, но как есть они не являются достаточным примером, потому что я не могу их запустить. Без запуска я не могу ничего протестировать, поэтому лучшее, что я могу сделать, это просмотреть код (без вопиющих ошибок) и попросить вас попробовать что-нибудь.   -  person Gregor Thomas    schedule 10.12.2014
comment
Привет Грегор, спасибо за ваш постоянный интерес к моей скромной проблеме. Поскольку я использую SPARQL и импортирую некоторые шейп-файлы, я попытался создать более или менее воспроизводимый пример здесь. Естественно, он не будет работать без шейп-файлов, доступных в этом zip файл. Что касается кода, я попробовал dta.simd$overall.quantiles <- as.factor(dta.simd$overall.quantiles), но пришел к той же ошибке.   -  person Konrad    schedule 10.12.2014
comment
возможный дубликат Как изменить метки (легенды) в ggplot?   -  person Paul Sweatte    schedule 22.01.2015
comment
Я не думаю, что это дубликат. Как указано в комментариях, я экспериментировал с as.factor(), но безрезультатно. Если бы это было единственное, проблема была бы решена к настоящему времени.   -  person Konrad    schedule 22.01.2015


Ответы (1)


fill=factor(overall.quantiles)

Я столкнулся с подобной проблемой и смог решить ее таким образом.

person Arslán    schedule 02.03.2015
comment
На случай, если кто-то еще встретит это разочаровывающее сообщение об ошибке, в моем случае оказалось, что названия штатов США в моем фрейме данных были в другом стиле, чем имена в пятьдесят_штатах (строчные и написанные). Как только я сопоставил их (используя tolower(state.name[match(stateOffices$State, state.abb)]), все заработало. - person lawyeR; 11.11.2017