Вам не кажется, на самом деле использовать время в вашем участке, но проблема заключается в долгот обтекание -180/180. Это можно решить, используя coord_map
, а не coord_polar
и гарантируя, что долготы не обертываются.
Загрузка пакетов и генерируют выборочные данные
library("ggplot2")
library("dplyr")
south_map <- map_data("world") %>% group_by(group) %>% filter(min(lat) <= -20)
set.seed(123)
track <- data.frame(long = cumsum(c(210,
unlist(lapply(c(1, -1), function(x) {
rnorm(50, x * 4, 4)
})))) %% 360 - 180,
lat = cumsum(c(-50, rnorm(100, 0.4, 2))),
A1 = sample(1:3, 101, replace = TRUE))
Убедитесь, что координаты не обернуть вокруг:
track_new <- track
long_diff <- diff(track$long)
long_diff[long_diff < -180] <- long_diff[long_diff < -180] + 360
long_diff[long_diff > 180] <- long_diff[long_diff > 180] - 360
track_new$long <- cumsum(c(track$long[1], long_diff))
Участок с использованием aziequidistant проекции. Обратите внимание, что это предполагает Северный полюс в центре, поэтому широты перевернуты, а затем скорректированы с помощью шкалы.
ggplot(track_new, aes(x = long, y = -lat)) +
geom_polygon(aes(group = group), data = south_map, colour = "grey", fill = "gainsboro") +
coord_map("azequidistant") +
geom_point(aes(colour = factor(A1)), size = 2) +
geom_path(colour = "grey", size = 1) +
scale_x_continuous(breaks = NULL) +
scale_y_continuous("latitude", breaks = 25 * 0:3, labels = -25 * 0:3)
Заключительный участок:

Просто для интереса, я думал, что это было бы интересно, чтобы произвести анимацию этого изображения. Вот код, чтобы сделать это:
track_new$alpha <- 1
# Setup longitude labels
long_labels <- data.frame(long = 45 * -3:4, lat = -22.5)
long_labels$label <- long_labels$long
long_labels$label[8] <- "\U00B1 180"
long_labels$angle <- long_labels$long + 67.5 + 180 * (long_labels$long >= 45)
# Set up the basic plot
p <- ggplot(track_new, aes(x = long, y = -lat)) +
geom_polygon(aes(group = group), data = south_map, colour = "grey", fill = "gainsboro") +
coord_map("azequidistant", ylim = c(20, 90)) +
geom_point(aes(colour = A1, alpha = alpha), size = 2) +
geom_path(aes(alpha = alpha), colour = "grey", size = 1) +
scale_x_continuous(breaks = NULL) +
scale_y_continuous("latitude", breaks = 22.5 * 0:3, labels = -22.5 * 0:3) +
scale_alpha_identity(guide = "none") +
geom_text(aes(label = label, angle = angle),
data = long_labels, colour = "dark blue", alpha = 0.5, size = 4)
# Produce the animation
p$data$alpha <- 0
for(i in 1:(nrow(track_new) + 10)) {
p$data$alpha <- pmax(p$data$alpha - 0.1, 0)
if (i <= nrow(track_new)) {
p$data$alpha[i] <- 1
}
png(file.path("BirdPlots", sprintf("BirdPlot%03d.png", i)), width = 1024, height = 1024, res = 100)
print(p)
dev.off()
if (!(i %% 5)) cat(i, "\n")
}
# This needs ImageMagick in the system path. For non-Windows systems, you
# might be better using system rather than shell
shell(paste("convert", file.path("BirdPlots", "BirdPlot*.png"),
file.path("BirdPlots", "BirdPlotAnimation.gif")))
И вот результат:

EDIT Исправленная версия кода Ayush в
track_df2 <- new_df2
long_diff <- diff(new_df2$Longitude)
long_diff[long_diff < -180] <- long_diff[long_diff < -180] + 360
long_diff[long_diff > 180] <- long_diff[long_diff > 180] - 360
track_df2$Longitude <- cumsum(c(new_df2$Longitude[1], long_diff))
track_df2$a3_id <- factor(track_df2$a3_id)
ggplot(track_df2, aes(x = Longitude, y = -Latitude)) +
coord_map("azequidistant", ylim = c(20, 90)) +
geom_point(aes(colour = a3_id, alpha = alpha), size = 2) +
geom_path(aes(alpha = alpha), colour = "grey", size = 1) +
scale_x_continuous(breaks = NULL) +
scale_y_continuous(breaks = 22.5 * 0:3, labels = -22.5 * 0:3) +
scale_alpha_identity(guide = "none")
Просто соедините точки на основе отсортированного времени ? – Vlo
согласен с @Vlo, я думаю, вам нужно просто преобразовать времена. аккуратная проблема –
@VIo Я тебя не понял. Можете ли вы привести мне пример или объяснить мне? – ayush