2016-02-26 105 views
4

我是新來閃亮。我想製作一個閃亮的應用程序,顯示不同參數的空間分佈。我使用sp包中的meuse數據集。閃亮:如何在同一張小冊子地圖上繪製幾個參數?

下面是我用

library(sp) 
library(rgdal) 
library(ggmap) 
library(leaflet) 
library(dplyr) 
library(shiny) 

ui <- fluidPage(
    mainPanel(
    titlePanel("Copper (ppm)"), 
    leafletOutput("copper"), 
    titlePanel("Lead (ppm)"), 
    leafletOutput("lead"), 
    titlePanel("Zinc (ppm)"), 
    leafletOutput("zinc") 
    ) 
) 
server <- function(input,output){ 
    output$copper <- renderLeaflet({ 

data(meuse) 
coordinates(meuse) <- 1:2 
proj4string(meuse) <- CRS("+init=epsg:28992")     
meuse <- spTransform(meuse, CRS("+proj=longlat +datum=WGS84")) 
meuse_df <- as.data.frame(meuse) 

leaflet(meuse_df) %>% 
    addProviderTiles("OpenStreetMap", group = "OpenStreetMap") %>% 
    addProviderTiles("Esri.WorldImagery", group = "Esri.WorldImagery") %>% 
    addCircleMarkers(~x, 
        ~y, 
        radius = ~copper/10, 
        stroke = FALSE, 
        fillOpacity = 0.4, 
        group = "meuse_df", 
        popup = ~as.character(copper)) %>% 
addLayersControl(position = "bottomleft", 
       baseGroups = c("OpenStreetMap", 
          "Esri.WorldImagery"), 
overlayGroups = "meuse_df") 
}) 
    output$lead <- renderLeaflet({ 

    leaflet(meuse_df) %>% 
    addProviderTiles("OpenStreetMap", group = "OpenStreetMap") %>% 
    addProviderTiles("Esri.WorldImagery", group = "Esri.WorldImagery") %>% 
    addCircleMarkers(~x, 
        ~y, 
        radius = ~lead/50, 
        stroke = FALSE, 
        fillOpacity = 0.4, 
        group = "meuse_df", 
        popup = ~as.character(lead)) %>% 
    addLayersControl(position = "bottomleft", 
        baseGroups = c("OpenStreetMap", 
            "Esri.WorldImagery"), 
        overlayGroups = "meuse_df") 
}) 

output$zinc <- renderLeaflet({ 

leaflet(meuse_df) %>% 
    addProviderTiles("OpenStreetMap", group = "OpenStreetMap") %>% 
    addProviderTiles("Esri.WorldImagery", group = "Esri.WorldImagery") %>% 
    addCircleMarkers(~x, 
        ~y, 
        radius = ~zinc/100, 
        stroke = FALSE, 
        fillOpacity = 0.4, 
        group = "meuse_df", 
        popup = ~as.character(zinc)) %>% 
    addLayersControl(position = "bottomleft", 
        baseGroups = c("OpenStreetMap", 
            "Esri.WorldImagery"), 
        overlayGroups = "meuse_df") 
}) 
} 
shinyApp(ui = ui, server = server) 

代碼,這裏是我

enter image description here

我不知道是否有繪製的所有參數(銅,鉛的方式和鋅的結果)在一張地圖上。任何建議,將不勝感激。

UPDATE

感謝@ Symbolix答案,並用checkBoxGroupInput的建議。相反,我用addCircleMarkers三次,所以我可以繪製在一個地圖上所有的金屬,我可以接通他們,並關閉

ui <- fluidPage(
mainPanel(
titlePanel("All metals (ppm)"), 
leafletOutput("metals") 
) 
) 
server <- function(input,output){ 
output$metals <- renderLeaflet({ 

data(meuse) 
coordinates(meuse) <- 1:2 
proj4string(meuse) <- CRS("+init=epsg:28992")     
meuse <- spTransform(meuse, CRS("+proj=longlat +datum=WGS84")) 
meuse_df <- as.data.frame(meuse) 

leaflet(meuse_df) %>% 
    addProviderTiles("OpenStreetMap", group = "OpenStreetMap") %>% 
    addProviderTiles("Esri.WorldImagery", group = "Esri.WorldImagery") %>% 
    addCircleMarkers(~x, 
        ~y, 
        radius = ~copper/10, 
        color ="red", 
        stroke = FALSE, 
        fillOpacity = 0.4, 
        group = "copper", 
        popup = ~as.character(copper)) %>% 
    addCircleMarkers(~x, 
        ~y, 
        radius = ~lead/50, 
        color ="gren", 
        stroke = FALSE, 
        fillOpacity = 0.4, 
        group = "lead", 
        popup = ~as.character(lead)) %>% 
    addCircleMarkers(~x, 
        ~y, 
        radius = ~zinc/100, 
        color ="blue", 
        stroke = FALSE, 
        fillOpacity = 0.4, 
        group = "zinc", 
        popup = ~as.character(zinc)) %>% 
    addLayersControl(position = "bottomleft", 
        baseGroups = c("OpenStreetMap", 
            "Esri.WorldImagery"), 
        overlayGroups = c("copper", 
            "lead", 
            "zinc")) 
}) 
} 
shinyApp(ui = ui, server = server) 
+0

你如何開關標記? – SymbolixAU

+0

@Symbolix 我的意思是在最後的應用 – aelwan

+0

的左下角的addLayersControl中勾選/取消圓圈標記啊,我明白了。感謝您澄清 – SymbolixAU

回答

4

融化你的資料,以便您的金屬在一列,你是好去。

這裏我用library(reshape2)來做熔化。

library(sp) 
library(rgdal) 
library(ggmap) 
library(leaflet) 
library(dplyr) 
library(shiny) 
library(reshape2) 

ui <- fluidPage(
    mainPanel(
     titlePanel("Metals"), 
     leafletOutput("all_metals") 
    ) 
) 
server <- function(input,output){ 

    output$all_metals <- renderLeaflet({ 

     data(meuse) 
     coordinates(meuse) <- 1:2 
     proj4string(meuse) <- CRS("+init=epsg:28992")     
     meuse <- spTransform(meuse, CRS("+proj=longlat +datum=WGS84")) 
     meuse_df <- as.data.frame(meuse) 

     ## melt df so 'metals' are in one column 
     ## using 'reshape2' library 
     meuse_melt <- melt(meuse_df, measure.vars = c("copper","lead","zinc"), variable.name = "metal") 

     ## specify factor levels for colours 
     meuse_melt$metal <- factor(sample.int(5L, nrow(meuse_melt), TRUE)) 
     factpal <- colorFactor(topo.colors(5), meuse_melt$metal) 

     ## now you just need one output 
     leaflet(meuse_melt) %>% 
      addProviderTiles("OpenStreetMap", group = "OpenStreetMap") %>% 
      addProviderTiles("Esri.WorldImagery", group = "Esri.WorldImagery") %>% 
      addCircleMarkers(~x, 
          ~y, 
          radius = ~value/100, 
          stroke = FALSE, 
          fillOpacity = 0.4, 
          group = "meuse_melt", 
          popup = ~metal, 
          color= ~factpal(metal)) %>% 
      addLayersControl(position = "bottomleft", 
          baseGroups = c("OpenStreetMap", "Esri.WorldImagery"), overlayGroups = "meuse_melt") 
    }) 

} 
shinyApp(ui = ui, server = server) 
+0

非常感謝您的時間和幫助。感謝您的回答,他們可以繪製在同一張地圖上。但是,它們彼此重疊,因此無法單擊並獲取每個參數(銅,鉛和鋅)的值。是否可以獲取每個參數的值(例如,當您單擊位置時,每個位置的圓形羣集會顯示三個參數的圓圈,您可以通過單擊該參數獲取每個參數的值圈)。 – aelwan

+0

@aelwan - 您的更新和後續問題會稍微改變您的原始問題。一旦已經回答了問題,改變你的問題並不是好習慣。相反,你應該接受這個答案(如果它解決了你原來的問題),然後問一個新的問題。 – SymbolixAU

+1

@aelwan沒問題。很高興我能幫上忙。 – SymbolixAU

3

爲了節省您的代碼行,你可以使用MapView的它提供了多層次的地圖開箱。如果你只想要某些屬性,你可以簡單地將他們的名字(或列號)提供給'zcol'參數。或者,您可以使用'burst = TRUE'來顯示屬性表中的所有圖層/列。

library(mapview) 
library(sp) 

data(meuse) 
coordinates(meuse) <- ~x+y 
proj4string(meuse) <- CRS("+init=epsg:28992")     
mapview(meuse, zcol = c("copper", "lead", "zinc")) 

## all layers 
mapview(meuse, burst = TRUE) 

mapview可以和renderLeaflet一起使用。

+0

非常感謝蒂姆,您的簡潔而完美的答案。 – aelwan

+0

您使用顏色來表示每個參數的不同值。是否有可能使用大小(即圓的半徑)以及 – aelwan

+1

是和否。您可以使用'cex'屬性將屬性映射到圓圈的大小/半徑,但是一次只能有一個。所以你需要按照以下步驟繪製你的圖形,以使這個工作適用於多個圖層。 'mapview(meuse,zcol =「copper」,cex =「copper」,col =「red」)+' 'mapview(meuse,zcol =「lead」,col =「blue」)+' 'mapview (meuse,zcol =「zinc」,col =「green」)' – TimSalabim

相關問題