填充颜色和标签在 Leaflet 中未正确映射
Fill colours and labels not mapping correctly in Leaflet
我正在(第一次)使用传单创建一些研究成果的交互式版本。我遇到一个问题,即填充颜色和标签没有正确映射到 shapefile。
我确定错误出在某个地方,但两个晚上后我无法理解错误所在。下面是一个使用简化数据集的示例。我已经上传了数据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")
标签不正确:
我认为您的行 rownames(att) <- data$station %>% unique
不正确(如果您查看 att
,您会发现行名与 station
值不同)。
在我看来,应该是:rownames(att) <- att$station
。
颜色 :
使用 colorFactor()
时,它会考虑变量的所有级别。如果您查看 spDF$adminRegion
的级别,您会发现 data$adminRegion
的所有原始 14 个级别仍然存在。
您有两个解决方案:
删除未使用的级别,并使用 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
.
完全相同的颜色
我正在(第一次)使用传单创建一些研究成果的交互式版本。我遇到一个问题,即填充颜色和标签没有正确映射到 shapefile。
我确定错误出在某个地方,但两个晚上后我无法理解错误所在。下面是一个使用简化数据集的示例。我已经上传了数据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")
标签不正确:
我认为您的行 rownames(att) <- data$station %>% unique
不正确(如果您查看 att
,您会发现行名与 station
值不同)。
在我看来,应该是:rownames(att) <- att$station
。
颜色 :
使用 colorFactor()
时,它会考虑变量的所有级别。如果您查看 spDF$adminRegion
的级别,您会发现 data$adminRegion
的所有原始 14 个级别仍然存在。
您有两个解决方案:
删除未使用的级别,并使用
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
.