2011-08-30 36 views
8

Akan Veriler great circle mapping tutorial'da öğrendiğim bazı şeyleri aldım ve R eğrileri trans-ekvator büyük çevreleri olduğunda garip şeylerin olmasını önlemek için yorumlarda bağlantılı kodla birleştirdim. Bu bana verir bu:Büyük daire harita üretimini otomatikleştirme 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() 
} 

tüm zamanlanmış ticari yolları içeren büyük bir veri kümesi için haritaların üretimini otomatik hale getirmek istiyorum - dummy sample - (airports.csv bağlantılıdır küresel ağda ATL ve diğer havaalanları arasında paylaşılan Akan Veri gönderisinde). Tercihen, Atlanta havaalanı ağ alanındaki değişiklikleri gösteren kısa bir videoda çerçeve olarak kullanacağım ayda bir harita üretecektim.

Sorun: Döngüyü, her bir çalıştırdığım her seferde tek bir PNG'den daha fazlasını üretmek için alamıyorum. Oldukça eminim ki, Aaron Hardin'in kodu, Akan Veriler eğitiminde kullanıldığı şekliyle otomasyonu “kırar”. Üç gün boyunca onunla uğraştıktan sonra ve her ne kadar alakalı bir şeyi takip edersek, bir diğeriyle uzlaşmak için pirzolalarımın eksik olduğunu anlıyorum. İşlemi otomatikleştiren biri var mı?

Sizin için bir tez onayı var!

+1

çağrınızda tam yolunu ve dosya adını kullanmak Sen bir sürü kod göstermektedir. Hala çalışmayan bir * minimal * örnek yapmaya çalışın. Örneğin, çok basit bir dizi grafik çizen basit bir döngü yapın. Daha da basit, her bir döngü basitçe 'i 've' monthyear [i] 'değerini yazsın. İşlemde bahse girerim, hatayı bulacaksınız. Değilse, * minimal * örneği gönderin ve birileri size yardımcı olabilir. – Andrie

+0

Çıktı formatı olarak pdf() 'yi kullanabilir ve ana etiketi olarak ayyıl kullanabilmektesiniz; bu sayede, döngüde her seferinde dosya çıkış bağlantısını açıp kapatmanız gerekmez. – mzuba

+0

@mzuba Evet, ancak her arsa için bir dosya yerine, yalnızca tek bir pdf dosyası alırsınız. İyi düşünülmüş bir cevap için – Andrie

cevap

13

Yorum yapmak için çok fazla bilgi var; İşte düşündüğüm (ve potansiyel olarak sorunun ne olabileceğini görmek için sonuna kadar okudum):

Kodunuzu Akan Veriler eğitimindeki orijinal veri üzerinde çalıştırmayı denedim. (Açıkçası aylık veriler için bir sütun eklemek zorunda, bu yüzden sadece ay :) randomise için bu satırı eklendi: Ben çalıştırmak için uzun zaman alan bir döngü var olduğunda, genellikle biraz sopa

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) 

Oradaki kod, bana bir ilerleme kontrolü veriyor. Fantazinizi çeken şeyi kullanın: print, cat, tcltk::tkProgressBar. Ben message kullanın:

for (i in 1:length(monthyear)) { 
    message(i) 
    # 
    # your code here 
    # 
} 

Neyse, ardından kodunuzu koştu. Her şey gerektiği gibi çalışır. Ben veri değerinde dört ay örneklenmiş beri, olsun:

  • i mevcut yineleme ile mesaj karanlık bir dünya haritası ve parlak sarı çizgilerle dört kez
  • Dört png araziler, her yazdırır.

enter image description here


Peki, neden benim makinede çalışır ve sizin değil: İşte dört satır biridir?

Sadece tahmin edebilirim, ama tahminimce çalışma dizini ayarlamadıysanız. Kodunuzda setwd yoktur ve png numaralı çağrı sadece dosya adını verir. Çalışma dizininiz sisteminizde ne olursa olsun, kodunuzun yazıldığından şüpheleniyorum.Varsayılan olarak

, benim yüklemesinde, çalışma dizini geçerli:

getwd() 
[1] "C:/Program Files/eclipse 3.7" 

, bu çözmek için aşağıdakilerden birini yapın:

  1. Kullanım setwd() üstündeki çalışma dizini senaryonun
  2. Ya png()
+1

+1 (her zamanki gibi!) – Ramnath

+0

Bu büyük bir yardım olacak gibi görünüyor. Bu projeye bugün ulaşamadım ama ne zaman yaptığımı bilmene izin vereceğim. Teşekkürler. – gpe