Если вы регулярно работаете с шейп-файлами, geom_path и geom_polygon предоставляют все, что вам нужно. В последних версиях ggplot напрямую занимается пространственными объектами, поэтому нет необходимости использовать fortify и merge (возможно, этот шаг занимает больше времени в вашем коде). Вот пример использования шейп-файла федеративных единиц Бразилии из IBGE в качестве базовой карты:
shapeUFs <- readOGR('.', 'BRUFE250GC_SIR')
shapeHid <- readOGR('.', 'PrincipaisRiosDoBrasil')
ggplot(shapeUFs, aes(long, lat, group = group)) +
geom_polygon(fill = 'gray90', color = 'black') +
geom_path(data = shapeHid, color = 'steelblue2') +
coord_map() + theme_void()
Производительность будет зависит от размера ваших фигур (определяется количеством функций и уровнем деталей) больше, чем геометрия, которую вы используете в ggplot. Вы можете использовать rgeos :: gSimplify, чтобы уменьшить количество вершин в объекте пространственных полигонов / линий. Вы также можете отображать точки непосредственно над картой:
# Simplifying the geometry of the federative units
shapeUFs.s <- rgeos::gSimplify(shapeUFs, .05, TRUE)
# Storing map in an object
riversMap <- ggplot(shapeUFs.s, aes(long, lat)) +
geom_polygon(aes(group = group), fill = 'gray90', color = 'black') +
geom_path(data = shapeHid, aes(group = group), color = 'steelblue2') +
coord_map() + theme_void()
# Sampling 20 cities in Brazil
brMunics <- read.csv('https://raw.githubusercontent.com/kelvins/Municipios-Brasileiros/master/Municipios_Brasileiros.csv')
Munics <- brMunics[sample(nrow(brMunics), 20), ]
# Plotting points over the map
riversMap + geom_point(data = Munics, aes(Longitude, Latitude), color = 'red')
# If your data already have the coordinates named 'lat' and 'long',
# you can skip aes(Longitude, Latitude):
names(Munics)[6:7] <- c('lat','long')
riversMap + geom_point(data = Munics, color = 'red')