如何根据Shiny输入动态更改填充属性,而无需在ggvis中重新绘制路径

时间:2015-01-30 09:36:55

标签: r mapping shiny ggvis

我正在尝试使用ggvis创建一个地图,该地图根据Shiny输入值以交互方式更新fill属性。但是,我遇到了三个问题:

  1. 将ggvis整合到Shiny中:无论出于何种原因,当我运行Shiny应用程序时ggvis都不会出现,虽然在Shiny应用程序之外,它显示得很好。如果它是相关的,我在运行OS Yosemite 10.10的Mac上使用RStudio。
  2. 更改填充属性而不重绘路径:我想根据输入值动态更改多边形的填充属性,而无需重新绘制路径本身。这种方法是为了减少运行时间,因为我映射了1450个政治单位,并且创建基础层需要一段时间。
  3. 更改图例值:填充基于分类值,该值基本上会切断连续变量(同样,尝试减少运行时间)。我也想自定义调色板,但是在使用scale_ordinal或add_legend中的参数来更改图例的显示值时遇到了问题。不是标记每个类别,我只想标记第一个和最后一个字符串为"低"和"高"分别
  4. 有关可重现的代码示例,请参阅下文。在此先感谢帮助Shiny / ggvis新手!

    server.ui

    # libraries
    suppressMessages(library(dplyr))
    suppressMessages(library(ggvis))
    library(shiny)
    library(RColorBrewer)
    # create dummy data
    base.long <- c(0, 1, 1, 0)
    base.lat <- c(0, 0, 1, 1)
    test <- data.frame(long = rep(c(base.long, base.long + 1), 3),
        lat = c(rep(base.lat, 2), rep(base.lat + 1, 2), rep(base.lat + 2, 2)),
        order = rep(1:4, 6), group = rep(seq(1:6), 4)[order(rep(seq(1:6), 4))], 
        var = rep(seq(5, 30, 5), 4)[order(rep(seq(5, 30, 5), 4))])
    # define color palette
    spectrum <- colorRampPalette(brewer.pal(n = 4, name="YlGn"))
    shinyServer(function(input, output) {
        # determine fill color based on variable 
        toplot <- reactive({
            test$fill.col <- as.character(cut(test$var, seq(10, 30, 5), 
            include.lowest = T, labels = spectrum(4)))
            test$fill.col <- ifelse(is.na(test$fill.col) | 
                    test$var < input$range[1] | test$var > input$range[2], 
                "#FFFFFF", test$fill.col)
            return(test)
        })
        toplot %>% 
            group_by(group) %>%
            ggvis(x = ~long, y = ~lat) %>%
            layer_paths(fill = ~fill.col) %>%
            scale_ordinal("fill", range = c("#FFFFFF", spectrum(4)),
                label = "Variable Value") %>%
            set_options(width = 400, height = 600, keep_aspect = T) %>%
            bind_shiny("test.ggvis")
    })
    

    ui.r

    suppressMessages(library("ggvis"))
    shinyUI(fluidPage(
            sidebarLayout(
                sidebarPanel(
                    sliderInput("range", label = "Filter Range",
                        min = 5, max = 30, step = 5, value = c(5, 25))
                ),
            mainPanel(ggvisOutput("test.ggvis"))
        )
    ))
    

0 个答案:

没有答案