#r #leaflet #polygon #spatial #sp
#r #листовка #полигон #пространственное #sp
Вопрос:
Я использую листовку (впервые) для создания интерактивной версии результатов некоторых исследований. У меня возникла проблема, заключающаяся в том, что цвета заливки и метки неправильно отображаются в шейп-файлах.
Я уверен, что ошибка где-то во мне, но после двух ночей я не могу понять, где. Ниже приведен пример использования упрощенного набора данных. Я загрузил данные https://gofile.io/?c=DKvFwr
pacman::p_load(tidyverse, data.table, leaflet, sp, maps, leaflet.extras, htmltools, rgdal)
# Load data
data = readRDS("exampleData.RDS")
data %>% str
# Create spatial polygons dataframe
spPolys = data %>%
group_by(station) %>%
do(poly=select(., long, lat) %>% Polygon()) %>%
rowwise() %>%
do(polys=Polygons(list(.$poly),.$station)) %>%
{SpatialPolygons(.$polys)}
att = data %>% group_by(station) %>% slice(1) %>% select(station, adminRegion, nestedLevel, river, location, area_km2, type) %>% as.data.frame
rownames(att) <- data$station %>% unique
spDF = SpatialPolygonsDataFrame(spPolys, data = att)
spDF@data
# Mapping
n = length(unique(spDF$adminRegion))
factorPal <- colorFactor(viridis::viridis(n), spDF$adminRegion)
spDF %>%
leaflet() %>%
addProviderTiles(provider = providers$Esri.WorldGrayCanvas) %>%
addPolygons(stroke = FALSE, smoothFactor = 0.2,
fillOpacity = 1.0, fillColor = ~factorPal(adminRegion),
label = ~adminRegion) %>%
addLegend(pal = factorPal, values = ~adminRegion,
opacity = 1.0, title = NULL,
position = "bottomright")
Ответ №1:
Неправильная маркировка:
я думаю, что ваша строка rownames(att) <- data$station %>% unique
неверна (если вы посмотрите на att
, вы можете увидеть, что имена строк отличаются от station
значений).
На мой взгляд, это должно быть: rownames(att) <- att$station
.
Цвета:
при использовании colorFactor()
учитываются все уровни вашей переменной. Если вы посмотрите на уровни spDF$adminRegion
, вы можете увидеть, что все исходные 14 уровней data$adminRegion
все еще присутствуют.
У вас есть два решения :
-
удалите неиспользуемые уровни и создайте палитру, используя
domain
аргумент (как вы и делали) :
spDF$adminRegion <- fct_drop(spDF$adminRegion)
factorPal <- colorFactor(viridis::viridis(n), domain = spDF$adminRegion) -
создайте палитру, используя
levels
аргумент, сохраняя только используемые уровни :
factorPal <- colorFactor(viridis::viridis(n), levels = unique(spDF$adminRegion))
Первое решение дает вам точно такие же цвета, как ggplot2
.
Комментарии:
1. что ж, это было раздражающе просто! спасибо вам за то, что просеяли это, поскольку я не собирался выявлять ни одну из этих проблем, поскольку я недостаточно знаком с leaflet