我已经在流动数据 great circle mapping tutorial中学到了一些我学到的东西,并将它们与评论中链接的代码相结合,以防止在R绘制跨赤道大圆时发生奇怪的事情.这给了我这个: airports - read.csv
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链接到流动数据帖子中).我最好每个月制作一张地图,我将用作描述亚特兰大机场网络空间变化的简短视频中的框架.
问题:我不能让循环产生任何多个PNG – 从每个CSV中的第一个唯一月份 – 每次运行它.我相当肯定Aaron Hardin的代码“打破”自动化,因为它在Flowing Data教程中使用.经过三天的混乱和追逐任何相关的R操作方法后,我意识到我只是缺乏调整与另一个相关的印章.任何人都可以帮我自动化这个过程吗?
这里有一篇论文答记给你!
评论的信息太多,所以我发布了一个答案.这是我的想法(并阅读到最后,看看可能是什么问题):我试图在Flowing Data教程中对原始数据运行代码. (显然你必须为月度数据添加一列,所以我只是添加这一行来随机化月份:):
airports <- read.csv("http://datasets.flowingdata.com/tuts/maparcs/airports.csv", header=TRUE) flights <- read.csv("http://datasets.flowingdata.com/tuts/maparcs/flights.csv", header=TRUE, as.is=TRUE) # Add column with random data for month flights$month <- sample(month.abb[1:4], nrow(flights), replace=TRUE)
每当我有一个需要很长时间才能运行的循环时,我通常会在那里添加一些代码来给我一个进度检查.使用你喜欢的东西:print,cat,tcltk :: tkProgressBar.我用消息:
for (i in 1:length(monthyear)) { message(i) # # your code here # }
无论如何,我然后运行你的代码.一切都完全正常.由于我采样了四个月的数据,我得到:
>当前迭代的i消息打印四次
>四个png图,每个都有一个黑色的世界地图和明亮的黄色线条.以下是四行之一:
那么,为什么它适用于我的机器而不是你的机器?
我只能猜测,但我的猜测是你没有设置工作目录.你的代码中没有setwd,对png的调用只给出了文件名.我怀疑您的代码是写入系统中的工作目录.
默认情况下,在我的安装中,工作目录是:
getwd() [1] "C:/Program Files/eclipse 3.7"
要解决此问题,请执行以下操作之一:
>使用setwd()将工作目录设置在脚本的顶部.>或者在调用png()时使用完整路径和文件名