2016-05-25 25 views
5

Próbuję utworzyć mapę ulotek z punktami określonymi przez zmienną. Czy jest możliwe utworzenie legendy z okręgami o różnych rozmiarach reprezentujących różne wartości zmiennych? Znalazłem inny wpis pokazujący, jak konwertować kwadraty do kół w legendzie, ale nie jestem pewien, jak zmienić rozmiar różnych okręgów w legendzie.Tworzenie legendy za pomocą kółka ulotki R

Oto przykładowy skrypt, który tworzy 10 punktów powiązanych z 2 klasami zmiennej (5 i 10). Chciałbym legendę z dwoma okręgami o tym samym rozmiarze, co ten określony przez addCircleMarkers o promieniu 5 i 10. Jeśli ktokolwiek może modyfikować, aby stworzyć to, co chcę, byłbym niezmiernie wdzięczny! Dzięki!

library(shiny) 
library(leaflet) 

#create data 
Points<-data.frame(x=runif(10,20,21), y=runif(10,0,1), var=rep(c(5,10),5)) 
map = leaflet() %>% addTiles() 

# Set up shiny app 
shinyApp(ui=bootstrapPage(
tags$style(type = "text/css", "html, body {width:100%;height:100%}", 
".leaflet .legend i{ 
border-radius: 50%; 
width: 10px; 
height: 10px; 
margin-top: 4px; 
} 
" 
), 
leafletOutput("myMap", width = "100%", height = "100%")), 

server= function(input, output){ 

output$myMap = renderLeaflet({map %>% 
    addCircleMarkers(Points$x,Points$y,radius=Points$var) %>% 
    addLegend(colors=rep("blue",2), labels=c(5,10)) 
    }) 
}) 

Odpowiedz

7

Masz szczęście. Bliższe spojrzenie na leaflet.js pokazuje, że konfiguracje DODAJ wewnątrz komendy addLegend stosowane są dosłownie tworzyć elementy Legenda:

Linia 1083 - 1086 z leaflet.js:

for (var i = 0; i < colors.length; i++) { 
    legendHTML += '<i style="background:' + colors[i] + ';opacity:' + 
       options.opacity + '"></i> ' + labels[i] + '<br/>'; 
} 

ten sposób możemy podkraść trochę dodatkowej stylizacji. W ramach argumentu colors dodajemy niektóre width i height, aby zmienić rozmiar znacznika i (= kółko legendy). I (jest to opcjonalne) możemy dokonać labels a div ze zmodyfikowanym stylem linii trasowania, ponieważ mają tendencję do utknięcia na szczycie linii, jeśli koło staje się duże.

Zrobiłem to, aby utworzyć dla ciebie niestandardową funkcję legendy. Przyjmuje to dodatkową wartość dla rozmiarów kół. (Jest to bardzo minimalna funkcja dla tej właśnie aplikacji.) Następnie dodaje stylizację, o której wspomniałem powyżej, bez potrzeby martwienia się o literówki lub inne błędy. Pamiętaj, że standardowy rozmiar to 10.

Kod poniżej. Baw się dobrze! I proszę napisz, jeśli są jakieś błędy lub błędy. Nie mogłem przetestować każdego możliwego scenariusza.

library(shiny) 
library(leaflet) 

#create data 
Points<-data.frame(x=runif(10,20,21), y=runif(10,0,1), var=rep(c(5,10),5)) 
map = leaflet() %>% addTiles() 

# Set up shiny app 
shinyApp(
    ui = bootstrapPage(
    tags$style(type = "text/css", "html, body {width:100%;height:100%}", 
     ".leaflet .legend i{ 
     border-radius: 50%; 
     width: 10px; 
     height: 10px; 
     margin-top: 4px; 
     } 
    "), 
    leafletOutput("myMap", width = "100%", height = "100%") 
), 

    server = function(input, output){ 
    addLegendCustom <- function(map, colors, labels, sizes, opacity = 0.5){ 
     colorAdditions <- paste0(colors, "; width:", sizes, "px; height:", sizes, "px") 
     labelAdditions <- paste0("<div style='display: inline-block;height: ", sizes, "px;margin-top: 4px;line-height: ", sizes, "px;'>", labels, "</div>") 

     return(addLegend(map, colors = colorAdditions, labels = labelAdditions, opacity = opacity)) 
    } 

    output$myMap = renderLeaflet({map %>% 
     addCircleMarkers(Points$x,Points$y,radius=Points$var) %>% 
     addLegendCustom(colors = c("blue", "blue", "red"), labels = c("A", "B", "C"), sizes = c(10, 20, 40)) 
    }) 
    } 
) 
Powiązane problemy