在地图上绘制具有相同纬度和经度的线(ggplot,geom_curve)

时间:2018-11-17 18:38:07

标签: r ggplot2

在使用R中的ggplot在地图上绘制线条时,我想向您寻求帮助。

假设有两个观测值A和B,它们的起点和终点的经度和纬度彼此相同。 我想画两条在地图上不重叠的线。

我尝试使用geom_curve(),但似乎在同一轨迹上绘制了两条线。

是否有解决此问题的聪明方法? 我会说这有点类似于geom_repel(),但不是文本或标签,而是曲线。

谢谢。

1 个答案:

答案 0 :(得分:1)

这是基本的R解决方案(tidyverse看起来比“ code-y”要少一点,但实际上是相同的。

如果确实是X和Y对,那么您要做的就是添加一个中点,并说中点抖动。我还没有为您完全“解决”此问题,因为您确实确实需要做一些工作(例如在执行此抖动hack之前仅对那些具有相同起点/终点的行过滤数据框):

library(ggplot2)

lines_df <- as.data.frame(state.center, stringsAsFactors = FALSE)[c(4,20,4,20),]
lines_df$grp <- c("a", "a", "b", "b")
lines_df$where <- rep("end", 4)

do.call(
  rbind.data.frame,
  lapply(
    split(lines_df, lines_df$grp),
    function(.df) {
      rbind.data.frame(
        .df, 
        data.frame(
          x = sum(.df$x)/2, y = sum(.df$y)/2, 
          grp = .df$grp[1], where = "mid",
          stringsAsFactors = FALSE
        )
      )

    }
  ) 
) -> lines_df

lines_df[lines_df$where == "mid", "y"] <- jitter(lines_df[lines_df$where == "mid", "y"])

ggplot(lines_df, aes(x, y, group=grp)) +
  geom_line(aes(color=grp))

enter image description here

注意:这没有考虑到地球是弯曲的,并且在足够长的直线上天真除以2的事实(特别是取决于投影)并不理想,但这是您解决问题的一种方法

tidyverse也认为这是最简单的方法的4eva人员发布具有相同逻辑的tidyverse解决方案。