TLDR
Вам нужно закрыть полигоны.
Объяснение
Давайте обрежем посторонний код и увеличим масштаб Австралии. (Хотя на самом деле проблема существует и для Африки и Южной Америки; она там не так очевидна ...)
Мы видим, что верхняя строка ведет себя неправильно. Он пересекается с береговой линией дальше на юг, а не придерживается правильного уровня широты:
ggplot() +
coord_map("orthographic", orientation = c(-40, 130, 0)) +
geom_map(data = world_map, map = world_map,
aes(x = long, y = lat, map_id=id),
fill = "darkgrey") +
theme_bw()
Теперь слой geom_map
, по существу, строит полигоны, а ?geom_polygon
сообщает:
Полигоны очень похожи на пути (как нарисовано geom_path()
) за исключением
что начальная и конечная точки соединены, а внутренняя часть окрашена
на fill
. Групповая эстетика определяет, какие случаи связаны
вместе в многоугольник.
Если мы заменим слой geom_map
его эквивалентами geom_polygon
/ geom_path
, ситуация станет намного более очевидной: полигон, соответствующий Австралии, не имеет верхней линии . Вместо этого путь начинается в одном углу и заканчивается в противоположном углу. geom_polygon
соединяет их прямой линией, которая может пересекать другие линии, когда система координат не является линейной (а coord_map
- нет):
ggplot() +
coord_map("orthographic",
orientation = c(-40, 130, 0)) +
geom_polygon(data = world_map,
aes(x = long, y = lat, group = group),
fill = "lightgrey") +
geom_path(data = world_map,
aes(x = long, y = lat, group = group)) +
theme_bw()
Решение
Мы можем вручную закрыть каждый многоугольник, повторяя его первую точку в конце. (Для полигонов, которые уже закрыты, это не имеет никакого дополнительного эффекта.)
library(dplyr)
world_map2 <- world_map %>%
group_by(group) %>% # each group corresponds to a unique polygon
arrange(order) %>% # sort points in the appropriate sequence
slice(c(1:n(), 1)) %>% # repeat first row after last row
mutate(order = seq(1, n())) %>% # define new order for n+1 rows
ungroup()
Проверьте, что многоугольники теперь закрыты, и верхняя линия для Австралии теперь хорошо отслеживает уровень своей широты:
ggplot() +
coord_map("orthographic",
orientation = c(-40, 130, 0)) +
geom_polygon(data = world_map2,
aes(x = long, y = lat, group = group),
fill = "lightgrey") +
geom_path(data = world_map2,
aes(x = long, y = lat, group = group)) +
theme_bw()
Применение этого к исходному сценарию использования:
ggplot() +
coord_map("orthographic", orientation = c(-90, 0, 0),
xlim = xlim_map, ylim = c(ylim_map[1], ylim_map[2] + 10)) +
geom_map(data = world_map2, map = world_map2,
aes(x = long, y = lat, map_id = id), fill = "black") +
geom_text(aes(x = 180, y = ylim_map[2]+5, label = "180°E"), color = "black") +
geom_text(aes(x = 90, y = ylim_map[2]+5, label = "90°E"), angle = -90, color = "black") +
geom_text(aes(x = 0, y = ylim_map[2]+5, label = "0°"), color = "black") +
geom_text(aes(x = -90, y = ylim_map[2]+5, label = "90°W"), angle = 90, color = "black") +
labs(y = "", x = "") +
# Theme
theme(text = element_text(size = 20),
panel.background = element_blank(),
axis.title = element_blank(),
axis.text = element_blank(),
axis.ticks = element_blank(),
axis.line = element_blank(),
aspect.ratio = 1)