2015-06-04 18 views
7

Khi tôi cố gắng thêm chú thích vào bản đồ tờ rơi cho bản đồ tờ rơi (sử dụng gói Leaflet for R) được tích hợp vào ứng dụng Sáng bóng, chú giải không hiển thị màu của bảng màu. Thay vào đó, nó chỉ hiển thị các màu được chỉ định cho các giá trị NA, trong trường hợp này là màu trắng.Chú thích bản đồ Leaflet trong ứng dụng R Shiny không hiển thị màu

legend without colors

Ứng dụng nào sau đây:

  • Đầu tiên, nó lọc một tập hợp các dữ liệu dựa trên đầu vào người sử dụng
  • Sau đó, nó sẽ tạo ra một bản đồ choropleth từ dữ liệu đã lọc

Đây là mã tôi đã sử dụng để tạo chú thích:

addLegend(position = "bottomleft", 
    pal = pal, values = shp.data()$stat.selected, 
    title = "Legend", 
    opacity = .5) 

đâu pal là một bảng màu quantile như sau

pal <-colorQuantile(c("#B2FF66","#66CC00","#4C9900","#336600","#193300"), 
        NULL, n = 5, na.color="#FFFFFF") 

shp.data() là một biểu hiện phản ứng đó là một shapefile lọc dựa trên đầu vào người dùng và stat_selected là số liệu thống kê cụ thể mà người sử dụng chọn để lập bản đồ vào màu sắc.

tôi nhận được những lời cảnh báo sau đây:

Warning in is.na(x) : 
    is.na() applied to non-(list or vector) of type 'NULL' 
Warning in is.na(values) : 
    is.na() applied to non-(list or vector) of type 'NULL' 

ban đầu tôi đã cố gắng để làm cho huyền thoại làm theo tấm gương trên tờ rơi cho trang R và sử dụng đối số values = ~stat.selected cho addLegend chức năng, nhưng tôi đã nhận lỗi này:

Error in UseMethod("doResolveFormula") : 
    no applicable method for 'doResolveFormula' applied to an object of class "NULL" 
+1

Từ trang trợ giúp: Nếu NULL, sau đó bất cứ khi nào hàm màu kết quả được gọi, giá trị x sẽ đại diện cho miền. Điều này ngụ ý rằng nếu hàm được gọi nhiều lần, việc mã hóa giữa các giá trị và màu sắc có thể không nhất quán; nếu tính nhất quán là cần thiết, bạn phải cung cấp một miền không NULL. Có thể thay đổi NULL sẽ giúp ích? – ytk

Trả lời

2

Tôi có thể làm cho màu sắc hiển thị bằng cách thay đổi cách tôi đã tham chiếu cột giá trị trong đối số của hàm AddLegend. Tôi đặt biến stat.selected trong ngoặc kép, mà dường như để sửa chữa các vấn đề:

addLegend(position = "bottomleft", 
      pal = pal, values = shp.data()[[stat.selected]], 
      title = "Legend", 
      opacity = 1 
     ) 

Để làm rõ, biến stat.selected xuất phát từ câu lệnh switch sau:

stat.selected <- isolate(switch(input$var.stat, 
           "Total employment" = "tot_emp", 
           "Mean annual wage" = "a_mean", 
           "Mean hourly wage" = "h_mean", 
           "Location quotient" = "loc_quotient" 
) 

nơi "tot_emp", "a_mean", "h_mean", và "loc_quotient" là các tên cột trong khung dữ liệu đa giác không gian shp.data.

Tôi đoán vấn đề là tôi đã cố chuyển tên cột theo biến bằng cách sử dụng $.

Tôi vẫn là người dùng R khá mới, vì vậy nếu có ai giải thích tại sao ví dụ trong tài liệu Leaflet for R không hoạt động trong trường hợp này, tôi sẽ đánh giá cao nó.

8

Trước đó tôi chỉ có một đoạn mã đơn giản cho thấy cách thêm chú thích. Tôi đã không sử dụng ~ trước khi các giá trị huyền thoại như là tiêu chuẩn. Tôi đã làm cột dataframe truyền thống $ và nó hoạt động độc đáo.

Điều này hiện được cập nhật để xem mọi thứ khớp với nhau như thế nào. Đây là một bản đồ chính thức chạy sau khi tạo tất cả các biến cắt, v.v.Khung dữ liệu được làm sạch cuối cùng được gọi là zipData

# create a full popup 
# add some HTML for editing the styles 

zipData$popUp <- paste('<strong>',zipData$Street, '</strong><br>', 
         'TIV = $',prettyNum(zipData$tiv, big.mark = ',',preserve.width = 'none'), '<br>', 
         'City: ', zipData$city, '<br>', 
         'YrBuilt = ', zipData$YearBuilt, '<br>', 
         'Construction = ', zipData$ConstructionCode, '<br>', 
         'Occupancy = ', zipData$OccupancyCode, '<br>', 
         'Premium = $' , prettyNum(zipData$Premium, big.mark = ',',preserve.width = 'none') , '<br>', 
         'GrossArea = ', prettyNum(zipData$GrossArea, big.mark = ',', preserve.width = 'none'), '<br>', 
         'RoofYr = ', zipData$RoofYearBuilt, '<br>') 

# set color scale for key factor 
colorsConst <- colorFactor(rainbow(4), zipData$ConstructionCode) 

# color scales for numerical bins 
colorstivValue <- colorFactor(palette = 'Accent', zipData$tivValueLvl) 
colorsYrBuilt <- colorFactor(palette = 'Spectral', zipData$yrBuiltLvl) 
colorsRoofYrBuilt <- colorFactor(palette = "YlOrRd", zipData$roofYrBuiltLvl) 


# begin the leaflet map construction 
# create the map opbject 

m <- leaflet() %>% 
    addTiles() %>% 

# add different tiles for different color schemes 

    addProviderTiles(providers$OpenStreetMap, group = 'Open SM') %>% 
    addProviderTiles(providers$Stamen.Toner, group = 'Toner') %>% 
    addProviderTiles(providers$CartoDB.Positron, group = 'CartoDB') %>% 
    addProviderTiles(providers$Esri.NatGeoWorldMap, group = 'NG World') %>% 
    setView(lng = -90, lat = 30, zoom = 10) %>% 

############################## 

    # this section is for plotting the variables 
    # each variable below is a layer in the map 

    # construction 
    addCircleMarkers(data = zipData, lat = ~Lat, lng = ~Lon, 
        color = ~colorsConst(ConstructionCode), popup = zipData$popUp, 
        radius = 5, group = 'Construction') %>% 
    # tiv 
    addCircleMarkers(data = zipData, lat = ~Lat, lng = ~Lon, 
        color = ~colorstivValue(tivLvl), popup = zipData$popUp, 
        radius = ~tiv/20000, group = 'Bldg Value') %>% 

    # year built 
    addCircleMarkers(data = zipData, lat = ~Lat, lng = ~Lon, 
        color = ~colorsYrBuilt(yrBuiltLvl), popup = zipData$popUp, 
        radius = ~YearBuilt/250, group = 'Yr Built') %>% 


###################################### 

    # layer control 

    addLayersControl(
     baseGroups = c('Open SM', 'Toner', 'Carto DB', 'NG World'), 

     overlayGroups = c('Construction', 
          'TIV', 
          'Yr Built' 
     ), 
     options = layersControlOptions(collapsed = F) 
    ) %>% 


#################################################  
add the legends for each of the variables 


    # construction   
    addLegend('bottomright', pal = colorsConst, values = zipData$ConstructionCode, 
       title = 'Construction Code', 
       opacity = 1) %>% 

    # tiv 
    addLegend('bottomleft', pal = colorstivValue, values = zipData$tivLvl, 
       title = 'TIV', 
       opacity = 1) %>% 

    # year built 
    addLegend('topleft', pal = colorsYrBuilt, values = zipData$yrBuiltLvl, 
       title = 'Yr Built', 
       opacity = 1) 


m # Print the map 

Một phần bản đồ được hiển thị bên dưới.

This shows the layer control and the construction legend

+0

lý do tại sao không cố định 1.5 năm sau đó, không có đầu mối ... – Ufos

+0

Chú thích chỉ có thể sử dụng ~ nếu cuộc gọi leaflet() có dữ liệu; nếu bạn cung cấp cho tờ rơi() gọi dữ liệu, thì tất cả các lớp có thể sử dụng nó. Cách này được viết, chỉ có cuộc gọi addCircleMarkers thực sự được đưa ra dữ liệu, vì nó chỉ được truyền cho lớp đó. –

+0

Như Joe đã chỉ ra, ví dụ của Bryan sẽ làm việc ngay cả với '~ login' nếu chỉ anh ta sử dụng' leaflet (zipData)%>% 'thay vì' leaflet() ' – Ufos

2

tôi đã cùng một thông điệp

Error in UseMethod("doResolveFormula") : no applicable method for 'doResolveFormula' applied to an object of class "NULL" 

với

data <- data.frame(lng1 = c(1, 2, 3), 
        lng2 = c(2, 3, 4), 
        lat1 = c(1, 2, 3), 
        lat2 = c(2, 3, 4), 
        values = c(1, 2, 3)) 

    pal_grid <- colorNumeric(palette = "YlGn", domain = data$values) 

    leaflet() %>% 
     addRectangles(lng1 = data$lng1, lat1 = data$lat1, 
       lng2 = data$lng2, lat2 = data$lat2, 
       fillColor = ~pal_grid(data$values), 
       fillOpacity = 0.2, 
       weight = 2, opacity = 0.5) 

Giải pháp là để cung cấp cho tờ rơi dữ liệu mà bạn đang sử dụng để tạo ra các yếu tố trong cuộc gọi chính đến leaflet() hoặc trong cuộc gọi đến bất kỳ phần tử nào bạn thêm sau đó.

  1. Trong cuộc gọi chính để tờ rơi():

    data <- data.frame(lng1 = c(1, 2, 3), 
           lng2 = c(2, 3, 4), 
           lat1 = c(1, 2, 3), 
           lat2 = c(2, 3, 4), 
           values = c(1, 2, 3)) 
    
    pal_grid <- colorNumeric(palette = "YlGn", domain = data$values) 
    
    leaflet(data = data) %>% 
        addRectangles(lng1 = data$lng1, lat1 = data$lat1, 
          lng2 = data$lng2, lat2 = data$lat2, 
          fillColor = ~pal_grid(data$values), 
          fillOpacity = 0.2, 
          weight = 2, opacity = 0.5) 
    
  2. Tại thời điểm thêm yếu tố:

    data <- data.frame(lng1 = c(1, 2, 3), 
           lng2 = c(2, 3, 4), 
           lat1 = c(1, 2, 3), 
           lat2 = c(2, 3, 4), 
           values = c(1, 2, 3)) 
    
    pal_grid <- colorNumeric(palette = "YlGn", domain = data$values) 
    
    leaflet() %>% 
        addRectangles(data = data, 
          lng1 = data$lng1, lat1 = data$lat1, 
          lng2 = data$lng2, lat2 = data$lat2, 
          fillColor = ~pal_grid(data$values), 
          fillOpacity = 0.2, 
          weight = 2, opacity = 0.5)` 
    
+0

Thật vậy tôi thậm chí có thể tạo ra một ví dụ với' NA' hoạt động hoàn toàn tốt đẹp, một khi 'tờ rơi()' được cung cấp với tập dữ liệu trong thời trang 'tờ rơi (my_data)'. – Ufos

Các vấn đề liên quan