我正试图用ggplot2绘制一只鸟在南极周围的轨迹。到目前为止,我有一个以极坐标投影的地图,我还设法正确绘制了轨迹点,我几乎正确地链接了它们但是 ......
当轨道越过国际日期线(即经度180°)时,ggplot2无法正确链接线路两侧的2个点。它确实连接了它们,但它们一直绕着地球连接。 所以我正在寻找一种方法来强制ggplot通过180°的最短路径连接点。
这是我的代码和结果图。
require(ggplot2)
require(rgdal)
数据:
track<-read.table("NOGP_87470_track.txt", sep="\t",h=T)
由75个以经度/纬度/日期(POSIXct)为特征的跟踪点组成。 PTT是这只鸟的名字。日期在这里没用。
head(track)
:
PTT long lat date
1 87470 51.645 -46.334 2009-02-03 14:50:00
2 87470 52.000 -46.289 2009-02-04 20:11:00
3 87470 52.556 -46.083 2009-02-06 07:15:00
4 87470 55.822 -44.667 2009-02-07 17:28:00
5 87470 60.679 -41.915 2009-02-09 04:03:00
6 87470 63.059 -41.649 2009-02-10 15:04:00
以下是轨道越过线(数据线:19&amp; 20)
的部分数据PTT long lat date
18 87470 160.907 -53.356 2009-02-28 06:25:00
19 87470 165.791 -54.588 2009-03-01 15:39:00
20 87470 -174.636 -50.893 2009-03-03 05:04:00
21 87470 -160.111 -50.832 2009-03-04 13:47:00
22 87470 -138.875 -53.474 2009-03-06 01:49:00
地图(笛卡尔坐标中世界海岸线的shapefile)
world<-readOGR("Coastlines\\World_continental_WGS84_Proj.shp", "World_continental_WGS84_Proj")
积
p <- ggplot(track, aes(x=long, y=lat))
p <- p + geom_polygon( data=world, aes(x=long, y=lat, group = group),colour="grey", fill="gainsboro" ) +
theme( panel.grid.major.x = element_blank()) +
coord_polar(theta="x", start=pi/2,direction=1) + # project the map in polar coordinates
ylim (-90, -20) # to keep only south hemisphere
pp <- p + geom_point(size=3,shape=19) + geom_path(size=1,col="grey")
这就是我得到的:
红色箭头是鸟的飞行方向:
我用绿色着色我要在180°线上连接的2个点,并在它们之间手动制作绿色虚线。正如你所看到的那样,它们通过一根直线连接在极点上,并且方向错误。
有没有人知道如何处理?
答案 0 :(得分:2)
你可以通过使用coord_map而不是coord_polar来实现这一点,并确保经度不会回绕到-180度,而是继续增加。我无法访问您的原始数据,也无法访问您正在使用的地图,因此我制作了自己的虚拟数据集。
加载包并创建地图和跟踪数据:
library("ggplot2")
library("dplyr")
south_map <- map_data("world") %>% group_by(group) %>% filter(min(lat) <= -20)
track <- data.frame(long = cumsum(c(210, rnorm(100, 5, 2))) %% 360 - 180,
lat = cumsum(c(-50, rnorm(100, 0.1, 2))))
初始极坐标
ggplot(track, aes(x=long, y=lat)) +
geom_polygon(aes(group = group), data = south_map, colour = "grey", fill = "gainsboro") +
theme(panel.grid.major.x = element_blank()) +
coord_polar(theta="x") + # project the map in polar coordinates
ylim(-90, -20) + # to keep only south hemisphere
geom_point(size = 3, shape = 19, colour = "red") + geom_path(size = 1, colour = "grey")
修复经度,使其不断增加
track_new <- track
long_diff <- diff(track$long)
long_diff[long_diff < -180] <- long_diff[long_diff < -180] + 360
track_new$long <- cumsum(c(track$long[1], long_diff))
使用地图投影绘图
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(size = 3, shape = 19, colour = "red") +
geom_path(size = 1, col = "grey") +
scale_x_continuous(breaks = NULL) +
scale_y_continuous("latitude", breaks = 25 * 0:3, labels = -25 * 0:3)
我不确定是否可以将一个等距离投影集中在南极上,所以我已经采取了纬度的负面因素并在标签阶段将其排除。我已经删除了x缩放,因为据我所知,它目前对coord_map并不起作用。如果需要,您可以使用geom_text
手动添加一些标记。