2011-08-30 13 views
8

ho preso alcune delle cose che ho imparato in un flusso di dati great circle mapping tutorial e li combina con codice legato nei commenti per evitare che cose strane accada quando R trame grandi cerchi trans-equatoriali. Questo mi dà questo:Automatizzare grande cerchio la produzione di mappe in 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() 
} 

mi piacerebbe automatizzare la produzione di mappe per un grande insieme di dati che contiene tutte le rotte commerciali di linea - dummy sample - condivisa tra ATL e altri aeroporti nella rete globale (airports.csv è collegato nel post di Flowing Data). Preferibilmente, produrrei una mappa al mese che userei come cornice in un breve video che descrive i cambiamenti nello spazio della rete aeroportuale di Atlanta.

Il problema: non riesco a ottenere il ciclo per la produzione di più di un PNG-da solo il primo mese unico in ogni CSV-ogni volta che l'eseguo. Sono abbastanza certo che il codice di Aaron Hardin "rompa" l'automazione così come è usata nel tutorial di Flowing Data. Dopo tre giorni di incasinatori e inseguimento di qualsiasi R how-to, mi rendo conto che mi mancano semplicemente le costolette per riconciliare l'una con l'altra. Qualcuno può aiutarmi ad automatizzare il processo?

C'è un riconoscimento di tesi per te!

+1

si mostra un sacco di codice. Prova a fare un esempio * minimo * che ancora non funziona. Ad esempio, crea un semplice ciclo che traccia una serie molto semplice di grafici. Ancora più semplice, lascia che ogni ciclo stampi semplicemente il valore di 'i' e' monthyear [i] '. Scommetto che nel processo troverai l'errore. In caso contrario, pubblica l'esempio * minimo * e qualcuno sarà in grado di aiutarti. – Andrie

+0

È possibile utilizzare 'pdf()' come formato di output e utilizzare monthyear come etichetta principale, in questo modo non è necessario aprire e chiudere la connessione di output del file ogni volta nel ciclo. – mzuba

+0

@mzuba Sì, ma in questo caso si ottiene solo un singolo file PDF, anziché un file per ogni trama. – Andrie

risposta

13

Troppe informazioni per un commento, quindi invio invece una risposta. Ecco quello che penso (e leggere fino alla fine per vedere quello che potrebbe essere potenzialmente il problema):

ho cercato di eseguire il codice sui dati originali nel tutorial flusso di dati. (Ovviamente si deve aggiungere una colonna per i dati mensili, così ho semplicemente aggiunto questa linea per randomizzare il mese :):

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) 

Ogni volta che ho un ciclo che richiede molto tempo per l'esecuzione, io in genere bastone un po ' di codice in là che mi dà un controllo di progresso. Usa ciò che ti piace: print, cat, tcltk::tkProgressBar. Io uso message:

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

Comunque, ho quindi eseguito il codice. Tutto funziona esattamente come dovrebbe Da quando ho provato quattro mesi di dati, ottengo:

  • Il messaggio con l'iterazione corrente di I Arte quattro volte
  • Quattro png trame, ognuna con una mappa del mondo oscuro e linee gialle luminose. Ecco una delle quattro linee:

enter image description here


Allora, perché funziona sulla mia macchina e non la tua?

Posso solo indovinare, ma la mia ipotesi è che non è stata impostata la directory di lavoro. Non c'è il numero setwd nel tuo codice e la chiamata a png dà solo il nome del file. Sospetto che il tuo codice sia stato scritto su qualunque sia la tua directory di lavoro nel tuo sistema.

Per impostazione predefinita, su mia installazione, la directory di lavoro è:

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

Per risolvere questo problema, effettuare una delle seguenti:

  1. Usa setwd() per impostare la directory di lavoro in cima il tuo copione
  2. Oppure utilizzare il percorso completo e il nome del file nella chiamata a png()
+1

+1 per una risposta ben ponderata (come al solito!) – Ramnath

+0

Sembra che sarà di grande aiuto. Non sono stato in grado di arrivare al progetto oggi, ma ti farò sapere come va quando lo faccio. Grazie. – gpe