Пользовательская статическая раскраска для полигонов Shiny Leaflet - PullRequest
0 голосов
/ 10 октября 2018

Есть ли способ создать собственную качественную цветовую палитру, которая отображает значения категорий на значения цвета?

Я пытаюсь создать базовую карту листовок в Shiny, которая окрашивает участки свойств (полигоны) по их землепользованию(фактор).Обычно это просто, но мне нужны определенные цвета для определенных категорий.

Например, участки с землепользованием 'Коммерческие' должны иметь цвет '# FF4C4C'.Существует около 10 категорий землепользования.

Я пытался разбить данные на разные слои:

leaflet() %>%
addPolygons(data=parcels[parcels$category == 'Commercial',], fillColor = '#FF4C4C') %>%
addPolygons(data=parcels[parcels$category == 'Residential',], fillColor = '#E9E946')

И так далее, но нарезка большого SpatialPolygonsDataFrame в десять раз медленная и занимает многоРесурсы.Дополнительная проблема заключается в том, что эти категории имеют подкатегории, которые необходимо будет отобразить позже, иногда до 20 подкатегорий, и нарезка spdf 10 + 20 раз не поможет.

Вся документацияи вопросы stackoverflow, которые я нашел, сосредоточены на определении диапазонов между двумя или более цветами, но я не хочу диапазоны.Я хочу точное отображение между уровнями факторов и определенными цветовыми кодами.

Я надеюсь, что есть простой ответ на этот вопрос.Я надеялся, что смогу сделать что-то вроде:

lu_pal <- c('Residential' = '#E9E946', 'Commercial' = '#FF4C4C')

и найти магическую функцию для превращения этого списка в мою палитру.

Ответы [ 2 ]

0 голосов
/ 11 октября 2018
parcels$category <- as.factor(parcel$category)

factpal <- colorFactor(c("#FF4C4C", "#E9E946"), parcels$category)

leaflet(parcels) %>%
  addPolygons(stroke = FALSE, smoothFactor = 0.2, fillOpacity = 1,
              color = ~factpal(category))
0 голосов
/ 10 октября 2018

Вы можете сделать что-то вроде этого:


Создание данных:

library(leaflet)
library(sp)
library(sf)

Sr1 = Polygon(cbind(c(2,4,4,1,2),c(2,3,5,4,2)))
Sr2 = Polygon(cbind(c(5,4,2,5),c(2,3,2,2)))
Sr3 = Polygon(cbind(c(4,4,5,10,4),c(5,3,2,5,5)))
Sr4 = Polygon(cbind(c(5,6,6,5,5),c(4,4,3,3,4)), hole = TRUE)

Srs1 = Polygons(list(Sr1), "s1")
Srs2 = Polygons(list(Sr2), "s2")
Srs3 = Polygons(list(Sr3, Sr4), "s3/4")
SpP = SpatialPolygons(list(Srs1,Srs2,Srs3), 1:3)

SpF <- st_as_sf(SpP)
SpF$category  <- c("Commercial", "Residential", "Residential")

Примечание: я переключаю SpatialPolygonsDataFrame на SimpleFeature из пакета sf, который легче и быстрее обрабатывать / манипулировать.

Итак, вы определяете соответствующий data.frame с цветами для каждой категории.Затем вы используете функцию merge и определяете, какие столбцы объединить.В этом примере полигон SpF имеет столбец category, а соответствующий кадр данных имеет столбец cat.При слиянии новый шейп-файл NewSp также будет иметь столбец col, в котором содержатся цвета.И вы просто передаете эти цвета в листовку.

matching = data.frame(
  cat = c("Commercial", "Residential"),
  col = c("#FF4C4C", "#E9E946")
)

NewSp <- base::merge(SpF, matching, by.x ="category", by.y="cat")

leaflet() %>% 
  addTiles() %>% 
  addPolygons(data=NewSp, color=NewSp$col, opacity = 1, fillOpacity = 0.6)
...