2014-06-18 7 views
5

मैं खुद को चमकदार से परिचित कर रहा हूं, हालांकि, परिचित एक अति उत्साही हो सकता है ... मैंने चमकदार ट्यूटोरियल की कोशिश की, विशेष रूप से मैं अपने data के लिए Lesson 5 अनुकूलित करना चाहता हूं।चमकदार और ggplot2 - ट्यूटोरियल

percent_map <- function(var, color, legend, min = 0, max = 100) { 

# constrain gradient to percents that occur between min and max 
var <- pmax(var, min) 
var <- pmin(var, max) 

#plot 
aha <- ggplot(abst, aes(long,lat, group=group))+ 
     geom_polygon(aes(fill=var))+ 
     coord_fixed()+ 
     scale_fill_gradient(low = "lightskyblue", high = color, 
        space = "Lab", na.value = "lightblue")+ 
     labs(title=var, x="", y="")+ 
     theme(axis.text=element_blank(), 
     axis.ticks=element_blank(), 
     panel.grid.minor = element_blank(), 
     panel.background = element_blank() 
     ) 
print(aha) 
} 

मेरे ui.R:

library(shiny) 

# Define UI for application that draws a histogram 
shinyUI(fluidPage(
titlePanel("Ja-Anteil von Abstimmungen"), 

sidebarLayout(
sidebarPanel(
    helpText("Create maps with information from ballot outcomes."), 

    selectInput("var", 
       label = "Choose a variable to display", 
       choices = c("Epidemiegesetz", 
          "BG", 
          "1:12", 
          "Familien", 
          "Nationalstrassenabgabegesetz"), 
       selected = "Epidemiegesetz"), 

    sliderInput("range", 
       label = "Range of interest:", 
       min = 0, max = 100, value = c(0, 100)) 

), 

mainPanel(plotOutput("map")) 
) 
)) 

और मेरे server.R:

मैं ट्यूटोरियल में की तरह एक अतिरिक्त आर-स्क्रिप्ट help.R, बनाया

library(ggplot2) 

abst <- readRDS("~/try.RDS") 
abst$KANTONSNR <- as.numeric(abst$KANTONSNR) 

source("~/help.R") 

library(shiny) 

shinyServer(
function(input, output) { 
output$map <- renderPlot({ 
    data <- switch(input$var, 
       "Epidemiegesetz" = abst$Epidemiegesetz, 
       "BG" = abst$BG, 
       "1:12" = abst$Loehne, 
       "Familien" = abst$Familien, 
       "Nationalstrassenabgabegesetz" = abst$Nationalstrassenabgabegesetz) 

    color <- switch(input$var, 
        "Epidemiegesetz" = "darkgreen", 
        "BG" = "red", 
        "1:12" = "darkorange", 
        "Familien" = "darkviolet", 
        "Nationalstrassenabgabegesetz" = "darkblue") 

    legend <- switch(input$var, 
        "Epidemiegesetz" = "Epidemiegesetz", 
        "BG" = "BG", 
        "1:12" = "Sozis", 
        "Familien" = "Familien", 
        "Nationalstrassenabgabegesetz" = "blablabla") 

    percent_map(var = data, color = color, max = input$range[2], min = input$range[1]) 
    }) 
    } 
) 

लेकिन वह ऐसा नहीं करता यहां तक ​​कि दूरस्थ रूप से काम:

Error: arguments imply differing number of rows: 0, 179493 

मैं क्या गलत कर रहा हूं? अग्रिम धन्यवाद।

+0

क्या आप इस मुद्दे को कम करने की कोशिश कर सकते हैं? मैंने एक स्थिर साजिश (यानी बिना चमकदार) उत्पन्न करने की कोशिश की और मुझे "त्रुटि: निरंतर पैमाने पर असतत मूल्य प्रदान किया गया"। क्या आप वाकई प्लॉटिंग कोड अपेक्षित काम कर रहे हैं? – tonytonov

+0

मुझे यकीन है कि प्लॉट काम करता है अगर मैं एक सामान्य ggplot नक्शा उत्पन्न करता हूं (निश्चित रूप से 'scale_fill_gradient' कमांड 'उच्च' के साथ निर्दिष्ट किया जाना चाहिए। – Thomas

उत्तर

4

सीधे डेटा को percent_map पर पास करने के बजाय, कॉलम नाम पास करें। यह भी तेज होगा क्योंकि यह अतिरिक्त प्रतिलिपि से बचाता है।

percent_map <- function(var, color, legend, min = 0, max = 100) { 

    # constrain gradient to percents that occur between min and max 
    abst$tmp_var <- abst[[var]] 
    abst$tmp_var <- pmax(abst$tmp_var, min) 
    abst$tmp_var <- pmin(abst$tmp_var, max) 

    #plot 
    aha <- ggplot(abst, aes(long, lat, group=group))+ 
    geom_polygon(aes(fill = tmp_var))+ 
    coord_fixed()+ 
    scale_fill_gradient(low = "lightskyblue", high = color, 
         space = "Lab", na.value = "lightblue")+ 
    labs(title=var, x="", y="")+ 
    theme(axis.text=element_blank(), 
      axis.ticks=element_blank(), 
      panel.grid.minor = element_blank(), 
      panel.background = element_blank() 
    ) 
    print(aha) 
    abst$tmp_var <- NULL 
} 

और server.R के लिए एक ठीक: यहाँ एक संशोधित सुविधा नहीं होती।

shinyServer(
    function(input, output) { 
    output$map <- renderPlot({ 
     data <- switch(input$var, 
        "Epidemiegesetz" = "Epidemiegesetz", 
        "BG" = "BG", 
        "1:12" = "Loehne", 
        "Familien" = "Familien", 
        "Nationalstrassenabgabegesetz" = "Nationalstrassenabgabegesetz") 

     color <- switch(input$var, 
         "Epidemiegesetz" = "darkgreen", 
         "BG" = "red", 
         "1:12" = "darkorange", 
         "Familien" = "darkviolet", 
         "Nationalstrassenabgabegesetz" = "darkblue") 

     legend <- switch(input$var, 
         "Epidemiegesetz" = "Epidemiegesetz", 
         "BG" = "BG", 
         "1:12" = "Sozis", 
         "Familien" = "Familien", 
         "Nationalstrassenabgabegesetz" = "blablabla") 

     percent_map(var = data, color = color, max = input$range[2], min = input$range[1], legend = legend) 
    }) 
    } 
) 

एक तरफ ध्यान दें के रूप में, legend तर्क वर्तमान में उपयोग नहीं है, तो आप labs(title=legend, x="", y="") मतलब था?

वैसे भी, यह अब त्रुटियों के बिना चलता है।

+0

आपको बहुत धन्यवाद, यह काम करता है - लगभग सही। नक्शा यूनिकोलर लगता है अब, मैं वापस ग्रेडेशन कैसे प्राप्त कर सकता हूं? – Thomas

+0

@ थॉमस मैंने अपना जवाब सही ढंग से 'pmin/pmax' भाग को संभालने के लिए संपादित किया है। अब स्लाइडर इरादे के रूप में काम करता है। – tonytonov

+0

बस सही है, धन्यवाद @tonytonov – Thomas