R: ggplot2 cu geom_map returnează eroarea „x și unitățile trebuie să aibă lungimea > 0” în ciuda valorilor convertite în factori (Programare, R, Ggplot2, Sparql, Shiny, Maptools)

Konrad a intrebat.

Lucrez la o aplicație strălucitoare primitivă care ar trebui să cartografieze unele date de la Date deschise pentru Scoția proiect. Am elaborat interogările SPARQL care fabrică un cadru de date care seamănă cu extrasul furnizat mai jos

dz_label overall.quantiles
S010001 8
S010002 9

Am shapefile-urile fortificate și încerc să le cartografiez cu ajutorul următorului cod:

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)

Codul returnează eroarea

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

Dacă înțeleg discuțiile similare (1, 2), problema este asociată cu clasele de valori. Cu toate acestea, am înțeles că as.factor() ar trebui să rezolve această problemă, dar, în mod evident, nu este cazul. Codul complet al aplicației este inclus mai jos. Bineînțeles, voi fi recunoscător pentru orice ajutor.

Server

# 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})
})

UI

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.")
    )
  )
))

Comentarii

  • Ați putea face acest lucru o minimală exemplu? Cu siguranță puteți reproduce problema cu o mostră de date mai mică, nu într-o aplicație strălucitoare. –  > Por Gregor Thomas.
  • Totuși, un lucru de încercat ar fi eliminarea numelui cadrului de date din interiorul aplicației aes(). Asigurați-vă că fill = as.factor(overall.quantiles), sau convertiți coloana într-un factor înainte de a o reprezenta grafic. –  > Por Gregor Thomas.
  • Gregor, vă mulțumim pentru interesul manifestat. Ideea mea a fost că cele două paragrafe inițiale vor fi apropiate de un exemplu minim, dar am decis să postez totul, doar de dragul de a oferi mai multe informații. –  > Por Konrad.
  • Primele două paragrafe sunt o idee bună, dar așa cum sunt nu sunt un exemplu suficient, deoarece nu le pot rula. Fără a rula, nu pot testa nimic, așa că tot ce pot face este să mă uit la cod (fără erori evidente) și să te rog să încerci ceva. –  > Por Gregor Thomas.
  • Nu cred că este un duplicat. Așa cum am subliniat în comentarii, am experimentat cu as.factor() dar fără niciun rezultat. Dacă acesta ar fi fost singurul lucru, problema ar fi fost rezolvată până acum. –  > Por Konrad.
1 răspunsuri
Arslán
fill=factor(overall.quantiles)

M-am confruntat cu o problemă similară și am reușit să o rezolv în acest fel.

Comentarii

  • În cazul în care altcineva se mai întâlnește cu acest mesaj de eroare frustrant, în cazul meu s-a dovedit că numele statelor americane din cadrul meu de date erau într-un stil diferit față de numele din fifty_states (minuscule și scrise). După ce le-am potrivit (folosind tolower(state.name[match(stateOffices$State, state.abb)]), totul a funcționat. –  > Por lawyeR.