У меня есть набор данных из нескольких тысяч географических точек, каждому из которых назначен кластер (в моем воспроизводимом примере ниже я упрощаю это до 8 точек). Я хочу раскрасить всю глобальную карту (только суши), используя k ближайших соседей к этим точкам. Я хочу визуализировать карту, используя буклет в r (в конечном итоге для блестящего приложения). Я могу построить результаты хорошо, используя ggplot, но столкнуться с некоторыми проблемами при использовании листовки. Проблемы:
- Растр не покрывает все antarcti c на листовой карте (я предполагаю, что мне нужно использовать набор данных, отличный от wrld_smpl, чтобы замаскировать растр, но не удалось при этом).
- Где бы ни встречались два разных кластера, в растровом покрытии есть пробел
- Береговые линии сильно пикселированы.
Я очень ценю любые руководство по решению этой проблемы!
Воспроизводимый пример:
# ggplot2 approach ###################################################################################
# Randomly generate 8 points with 8 clusterlabels
train = data.frame(lon=runif(8, -180, 180),lat=runif(8,-90,90), clustername=1:8)
train
library(ggplot2)
library(raster)
library(class)
library(maptools) # for wrld_smpl data
# Get data for land borders
data(wrld_simpl)
# Make grid of lat/lon points covering whole world
dfgrid = expand.grid(lon=seq(-180,180,by=.1), lat =seq(-90,90, by=.1))
# Convert to spatial points, specify correct coordinate reference system (CRS), same as wrld_smpl
pts <- SpatialPoints(dfgrid, proj4string=CRS(proj4string(wrld_simpl)))
# Only keep points over land
dfgrid = dfgrid[!is.na(over(pts, wrld_simpl)$FIPS),]
#dfgrid$clusterlabels = 1
# Asign cluster labels using knn
dfgrid$clusterlabels = knn(train=train[,c("lon","lat")],
test=dfgrid[,c("lon", "lat")],
cl=train$clustername,
k=1)
r = rasterFromXYZ(dfgrid, crs = "+proj=longlat")
r
#plotting
var_df <- as.data.frame(rasterToPoints(r))
p <- ggplot() +
geom_polygon(data = wrld_simpl[wrld_simpl@data$UN!="10",],
aes(x = long, y = lat, group = group),
colour = "black", fill = "grey") # does the fortification automatically
p <- p + geom_tile(data = var_df, aes(x = x, y = y, fill = as.factor(clusterlabels)))+
theme(legend.title = element_blank())
p = p + scale_fill_brewer(palette = "Paired")
p
# leaflet approach #############################################################################################
library(leaflet)
pal <- colorFactor("Paired", values(r),na.color = "transparent")
leaflet() %>% addTiles()
leaflet() %>% addTiles() %>%
addRasterImage(r, colors = pal, opacity = 0.8) %>%
addLegend(pal = pal, values = values(r),
title = "Cluster label")