如何正确链接极坐标投影图周围的跟踪点?

时间:2014-08-06 09:51:33

标签: r dictionary ggplot2 polar-coordinates

我正试图用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")

这就是我得到的:

红色箭头是鸟的飞行方向:

bird image

我用绿色着色我要在180°线上连接的2个点,并在它们之间手动制作绿色虚线。正如你所看到的那样,它们通过一根直线连接在极点上,并且方向错误。

有没有人知道如何处理?

1 个答案:

答案 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")

Initial polar plot

修复经度,使其不断增加

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)

Map projected plot

我不确定是否可以将一个等距离投影集中在南极上,所以我已经采取了纬度的负面因素并在标签阶段将其排除。我已经删除了x缩放,因为据我所知,它目前对coord_map并不起作用。如果需要,您可以使用geom_text手动添加一些标记。