概览
为了绘制交通流量图,我们先要获得任意两个结点之间,交通的密集程度。随后我们把结点匹配到地图上,并依据不同交通密集程度给结点着以不同颜色,最终完成流量图。
安装库
本次推送用到的库包括plyr
、ggplot2
和maptools
。以plyr
为例,安装方法为:
install.packages('plyr')
下载数据
本次推送需要用到的数据为英国地图和交通始发地及目的地数据。读者可以点击http://ingrid.geog.ucl.ac.uk/~james/msoa_popweightedcentroids.csv和http://marlin.casa.ucl.ac.uk/~james/wu03ew_v1.csv.zip进行下载。
获得结点间的交通流量
> library(plyr) #读入必要的库 > library(ggplot2) > library(maptools) > wu03ew_v1 <- read.csv("wu03ew_v1.csv") #导入交通数据 > input<- wu03ew_v1[,1:3] #导入我们需要的前三列数据:起始地、目的地、交通频度 > names(input)<- c("origin", "destination","total") # 给三列数据重新命名,方便后续操作
将交通数据和地图匹配
> centroids <- read.csv("msoa_popweightedcentroids.csv") #读入地图 > or.xy<- merge(input, centroids, by.x="origin", by.y="Code") #获取起始点坐标 > names(or.xy) <- c("origin", "destination", "trips", "o_name", "oX", "oY") #和上面保持一致,我们给数据列重新命名,以便后续匹配 > dest.xy <- merge(or.xy, centroids, by.x="destination", by.y="Code") #获取起始点坐标 > names(dest.xy) <- c("origin", "destination", "trips", "o_name", "oX", "oY","d_name", "dX", "dY") #同样,对数据重命名
绘图
> xquiet <- scale_x_continuous("", breaks = NULL) #确定坐标轴的标度 > yquiet <- scale_y_continuous("", breaks = NULL) > quiet <- list(xquiet, yquiet) #把两条坐标轴的标度属性放在一个列表里,后续操作可以少打一些代码 > ggplot(dest.xy[which(dest.xy$trips > 10),], aes(oX, oY)) + #用来绘图的数据是dest.xy,在这里我们略去交通频度小于10的连线,以免图片太过杂乱 + geom_segment(aes(x = oX, y = oY,xend = dX, yend = dY, alpha = trips), col = "white") + #把起始点、目的地的坐标放入aesthetics中,它们连线的透明度即交通频度 + scale_alpha_continuous(range = c(0.03, 0.3)) + #调整透明度上下界 + theme(panel.background = element_rect(fill = 'black', colour = 'black')) + #加主题 + quiet + #把刚刚的坐标标度加入ggplot中 + coord_equal()
最终成品如上图所示。图中亮度越高代表交通流量越大,比如图中亮度最高的地区即为英国交通最密集的结点——伦敦。此外,英国其余几个大城市,如利物浦、爱丁堡等地,在图中的亮度都比较高,所代表的交通密集程度很大。