2016-05-25 18 views
5

Bir değişkene göre boyutlandırılmış bir broşür haritası oluşturmaya çalışıyorum. Farklı değişken değerlerini temsil eden farklı büyüklükteki daireler içeren bir efsane yaratmak mümkün mü? Efsanedeki kareleri çevrelerin nasıl dönüştürüleceğini gösteren başka bir yazı buldum, ancak efsanedeki farklı dairelerin boyutunu nasıl değiştireceğimi bilmiyorum. Örneğin, bir değişken (5 ve 10) 2 sınıfıyla ilişkili 10 puan oluşturan sahte bir komut dosyasıdır. Örneğin; 5 ve 10 yarıçaplı addCircleMarkers ile belirtilenle aynı boyutta iki daireye sahip bir efsane istiyorum. İstediğimi oluşturmak için herhangi bir değişiklik yapabilirse, son derece minnettar olurdum! Teşekkürler!Daireler broşürü ile açıklama oluşturma R

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

cevap

7

Şanslısınız. leaflet.js daha yakından bir bakış addLegend komuta içerdeki eklenti yapılandırmaları, efsane öğeleri oluşturmak için tam anlamıyla kullanıldığını gösterir:

Çizgiler 1083 - leaflet.js den 1086:

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

Bu şekilde Bazı ekstra stillerde gizlenebiliriz. colors tartışmasında, i etiketinin boyutunu değiştirmek için bazı width ve height ekleriz (= gösterge dairesi). Ve (bu isteğe bağlı) labels'u div'u değiştirilmiş hizalama stili ile yapabiliriz, çünkü çember büyürse, çizginin üst kısmına takılıp kalmamaya eğilimlidirler.

Sizin için özel bir gösterge işlevi oluşturma özgürlüğünü aldım. Bu, daire boyutları için ek bir değer alır. (Bu sadece bir uygulama için çok az bir fonksiyon.) Daha sonra yazım hataları veya diğer hatalar hakkında endişelenmenize gerek kalmadan yukarıda bahsettiğim stilleri ekler. Standart boyutun 10 olduğunu unutmayın.

Aşağıdaki kod. İyi eğlenceler! Ve herhangi bir hata veya hata varsa lütfen yazınız. Her olası senaryoyu test edemedim.

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