我将在流动数据 大圆映射教程 中学到的一些内容与评论中链接的代码结合起来,以防止 R 绘制跨赤道大圆时出现奇怪的情况。这给了我这个:
airports <- read.csv("/home/geoff/Desktop/DissertationData/airports.csv", header=TRUE)
flights <- read.csv("/home/geoff/Desktop/DissertationData/ATL.csv", header=TRUE, as.is=TRUE)
library(maps)
library(geosphere)
checkDateLine <- function(l){
n<-0
k<-length(l)
k<-k-1
for (j in 1:k){
n[j] <- l[j+1] - l[j]
}
n <- abs(n)
m<-max(n, rm.na=TRUE)
ifelse(m > 30, TRUE, FALSE)
}
clean.Inter <- function(p1, p2, n, addStartEnd){
inter <- gcIntermediate(p1, p2, n=n, addStartEnd=addStartEnd)
if (checkDateLine(inter[,1])){
m1 <- midPoint(p1, p2)
m1[,1] <- (m1[,1]+180)%%360 - 180
a1 <- antipode(m1)
l1 <- gcIntermediate(p1, a1, n=n, addStartEnd=addStartEnd)
l2 <- gcIntermediate(a1, p2, n=n, addStartEnd=addStartEnd)
l3 <- rbind(l1, l2)
l3
}
else{
inter
}
}
# Unique months
monthyear <- unique(flights$month)
# Color
pal <- colorRampPalette(c("#FFEA00", "#FF0043"))
colors <- pal(100)
for (i in 1:length(monthyear)) {
png(paste("monthyear", monthyear[i], ".png", sep=""), width=750, height=500)
map("world", col="#191919", fill=TRUE, bg="black", lwd=0.05)
fsub <- flights[flights$month == monthyear[i],]
fsub <- fsub[order(fsub$cnt),]
maxcnt <- max(fsub$cnt)
for (j in 1:length(fsub$month)) {
air1 <- airports[airports$iata == fsub[j,]$airport1,]
air2 <- airports[airports$iata == fsub[j,]$airport2,]
p1 <- c(air1[1,]$long, air1[1,]$lat)
p2 <- c(air2[1,]$long, air2[1,]$lat)
inter <- clean.Inter(p1,p2,n=100, addStartEnd=TRUE)
colindex <- round( (fsub[j,]$cnt / maxcnt) * length(colors) )
lines(inter, col=colors[colindex], lwd=1.0)
}
dev.off()
}
我希望自动化制作地图,用于包含所有预定商业路线的大型数据集 — dummy sample — 与全球网络中的ATL和其他机场共享(airports.csv链接在Flowing Data帖子中)。最好每月生成一张地图,我将使用它作为短视频中的一个帧,描述亚特兰大机场网络空间的变化。 问题:每次运行循环时,我无法获得比一个PNG更多的内容 —— 仅来自每个CSV中第一个唯一月份。我相当确定Aaron Hardin的代码在Flowing Data教程中使用时“破坏”了自动化。经过三天的折腾和追寻任何相关的R how-to,我意识到我简单地缺乏调和两者的能力。有人能帮我自动化这个过程吗?
你会得到一份论文致谢!
i
和monthyear [i]
的值。我敢打赌,在这个过程中你会发现错误。如果没有,请发布最小的例子,有人将能够帮助你。 - Andriepdf()
作为输出格式,并使用 monthyear 作为主标签,这样你就不必在循环中每次打开和关闭文件输出连接。 - mzuba