在使用R中的ggplot在地图上绘制线条时,我想向您寻求帮助。
假设有两个观测值A和B,它们的起点和终点的经度和纬度彼此相同。 我想画两条在地图上不重叠的线。
我尝试使用geom_curve(),但似乎在同一轨迹上绘制了两条线。
是否有解决此问题的聪明方法? 我会说这有点类似于geom_repel(),但不是文本或标签,而是曲线。
谢谢。
答案 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))
注意:这没有考虑到地球是弯曲的,并且在足够长的直线上天真除以2的事实(特别是取决于投影)并不理想,但这是您解决问题的一种方法
tidyverse
也认为这是最简单的方法的4eva人员发布具有相同逻辑的tidyverse
解决方案。