【发布时间】:2018-12-20 09:04:12
【问题描述】:
我正在努力画出所谓的spider network 或desire line,它说明事物(人、车辆等)在特定区域之间按方向移动。
这是我正在使用的数据框:
df <- data.frame(O=c(1,2,4,4,4,6,6,6,7,7,7,9,9,9,9,10,10,10,11,12,12,12,32,86,108,128,128,157,157,157,157,157),
D=c(2,1,6,7,32,4,7,157,4,6,157,10,11,12,157,9,12,157,9,9,10,157,4,128,128,86,108,6,7,9,10,12),
trip=c(971,971,416,621,330,416,620,1134,621,620,625,675,675,378,439,675,724,472,675,378,724,563,330,610,405,610,405,1134,625,439,472,563),
lon.x=c(697746.6,696929.6,696748.8,696748.8,696748.8,694906.4,694906.4,694906.4,696769.4,696769.4,696769.4,698802.2,698802.2,698802.2,698802.2,698900.5,698900.5,698900.5,699686.7,696822.0,696822.0,696822.0,698250.7,702314.7,700907.1,702839.5,702839.5,694518.9,694518.9,694518.9,694518.9,694518.9),
lat.x=c(9312405,9311051,9308338,9308338,9308338,9307087,9307087,9307087,9305947,9305947,9305947,9304338,9304338,9304338,9304338,9302314,9302314,9302314,9306300,9303080,9303080,9303080,9309423,9320738,9321302,9322619,9322619,9301921,9301921,9301921,9301921,9301921),
lon.y=c(696929.6,697746.6,694906.4,696769.4,698250.7,696748.8,696769.4,694518.9,696748.8,694906.4,694518.9,698900.5,699686.7,696822.0,694518.9,698802.2,696822.0,694518.9,698802.2,698802.2,698900.5,694518.9,696748.8,702839.5,702839.5,702314.7,700907.1,694906.4,696769.4,698802.2,698900.5,696822.0),
lat.y=c(9311051,9312405,9307087,9305947,9309423,9308338,9305947,9301921,9308338,9307087,9301921,9302314,9306300,9303080,9301921,9304338,9303080,9301921,9304338,9304338,9302314,9301921,9308338,9322619,9322619,9320738,9321302,9307087,9305947,9304338,9302314,9303080))
df 包含以下字段:O:行程起点 D:行程目的地 trip:O 和 D 之间的行程次数 lon.x:原区经度 lat.x:原区纬度 lon.y:目的区经度 lat.y:目的区纬度
目前我可以使用geom_segment在ggplot2包中的脚本在这里绘制下图:
library(ggplot2)
ggplot() +
geom_segment(data = df, aes(x = lon.x, y = lat.x, xend = lon.y, yend = lat.y, size = trip),
color = "blue", alpha = 0.5, show.legend = TRUE,
position = position_dodge2(width = 100)) +
scale_size_continuous(range = c(0, 5), breaks = c(300, 600, 900, 1200),
limits = c(100, 1200), name = "Person trips/day (over 100 trips)") +
theme(legend.key = element_rect(colour = "transparent", fill = alpha("black", 0))) +
guides(size = guide_legend(override.aes = list(alpha = 1.0))) +
geom_point(data = df, aes(x = lon.x, y = lat.x), pch = 16, size = 2.4)
问题是从O 到D 和从D 到O 的每一行都是重叠的。我更喜欢根据中心线绘制被闪避的段,以正确可视化总行程数并查看区域对之间的行程平衡。
期望结果的示例如下所示。
虚线中心线不一定要显示(我只是为了显示余额是什么)。还优选按方向改变颜色,例如顺时针方向为红色,逆时针方向为蓝色。如果可以用彩色显示方向,则不需要箭头。
我找到了一些解决问题的示例,但目前我无法达到理想的结果。
坐标偏移量的计算
在这个例子中为每个方向设置偏移并不容易,因为我有大约 80 个区域,这导致了 6,400 对区域。
Offset geom_segment in ggplot
position_dodge2 函数
它说我可以使用变量在width 中设置段之间的边距,但是如果我在其中使用trip,它会返回错误。此外,尚不清楚我应该为适当的偏移量设置多少值以使线段遵循中心线。
https://ggplot2.tidyverse.org/reference/position_dodge.html
geom_curve 和 arrow
也可以用曲线画线,这样就可以解决上述问题。然而,曲线段很难观察到一个图形中的运动。箭头也有点难以看清方向,因为箭头的形状不尖锐,虽然我改变了它的样式。
color=variable 和 position=dodge
我还尝试spread/gatherdf 来获取新变量direction 并删除相反方向的OD 对,以便我认为我可以使用color=direction 和position=dodge 在ggplot2 中轻松躲避段,但是它效果不佳(部分仍然重叠)。小例子如下所示。
O D trip direction lon.x lat.x lon.y lat.y
1 2 971 clock 697746.6 9312405 696929.6 9311051
2 1 300 anticlock 696929.6 9311051 697746.6 9312405
4 6 416 clock 696748.8 9308338 694906.4 9307087
4 7 621 anticlock 694906.4 9307087 696748.8 9308338
【问题讨论】:
-
不仅使用 ggplot,构建它的其他包可能会有所帮助。我不确定
igraph包在这里是否有好处。 -
查看
ggraph包。 -
感谢您的建议。目前我还没有发现这些包是否提供了我需要的功能。