2011-08-30 13 views
8

He tomado algunas de las cosas que aprendí en un Flowing Data great circle mapping tutorial y las he combinado con código vinculado en los comentarios para evitar que cosas extrañas sucedan cuando R traza grandes círculos trans-ecuatoriales. Eso me da esto:Automatizando la producción de mapas de gran círculo en 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() 
} 

me gustaría para automatizar la producción de mapas para un gran conjunto de datos que contiene todas las rutas comerciales regulares - dummy sample - compartida entre ATL y otros aeropuertos en la red mundial (airports.csv está vinculado a en la publicación Datos de flujo). Preferentemente, produciría un mapa por mes que usaría como marco en un breve video que muestra los cambios en el espacio de la red del aeropuerto de Atlanta.

Problema: No puedo obtener el ciclo para producir más de un PNG, desde solo el primer mes único en cada CSV, cada vez que lo ejecuto. Estoy bastante seguro de que el código de Aaron Hardin 'rompe' la automatización tal como se usa en el tutorial de Flowing Data. Después de tres días de meterme con él y buscar cualquier cosa relevante de R, me doy cuenta de que simplemente carezco de los medios para reconciliar uno con el otro. ¿Alguien puede ayudarme a automatizar el proceso?

¡Hay un reconocimiento de disertación para usted!

+1

le mostrará una gran cantidad de código. Intenta hacer un * * * ejemplo mínimo que todavía no funciona. Por ejemplo, crea un bucle simple que traza una serie muy simple de gráficos. Incluso más simple, deje que cada ciclo simplemente imprima el valor de 'i' y' monthyear [i] '. Apuesto que en el proceso encontrará el error. De lo contrario, publique el ejemplo * mínimo * y alguien podrá ayudarlo. – Andrie

+0

Puede usar 'pdf()' como formato de salida y usar monthyear como etiqueta principal, de esta manera no tiene que abrir y cerrar la conexión de salida de archivo cada vez que esté en su ciclo. – mzuba

+0

@mzuba Sí, pero luego se obtiene un solo archivo pdf, en lugar de un archivo para cada parcela. – Andrie

Respuesta

13

Demasiada información para un comentario, así que publico una respuesta. Esto es lo que pienso (y lea hasta el final para ver cuál podría ser el problema):

He intentado ejecutar su código con los datos originales en el tutorial de Datos de flujo. (Obviamente, hay que añadir una columna para los datos mensuales, por lo que simplemente añadido esta línea para asignar al azar el mes :):

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) 

Cada vez que tengo un bucle que se necesita mucho tiempo para funcionar, por lo general se adhieren un poco de código allí que me da una verificación de progreso. Use lo que le apetezca: print, cat, tcltk::tkProgressBar. Yo uso message:

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

De todos modos, me encontré a continuación su código. Todo funciona exactamente como debería. Desde Probé cuatro meses el valor de los datos, me sale:

  • El mensaje con la iteración actual de i imprime cuatro veces
  • Cuatro png parcelas, cada una con un mapa del mundo oscuro y líneas de color amarillo brillante. Aquí está una de las cuatro líneas:

enter image description here


Así que, ¿por qué funciona en mi máquina y no la tuya?

Solo puedo adivinar, pero supongo que no ha configurado el directorio de trabajo. No hay setwd en su código, y la llamada a png solo da el nombre de archivo. Sospecho que su código se está escribiendo en cualquier directorio de trabajo que tenga en su sistema.

Por defecto, en mi instalación, el directorio de trabajo es:

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

Para solucionar este problema, siga uno de los siguientes:

  1. Uso setwd() para establecer el directorio de trabajo en la parte superior de tu guion
  2. O utilizar la ruta completa y el nombre del archivo en su llamada a png()
+1

+1 para una respuesta minuciosa y bien pensada (¡como de costumbre!) – Ramnath

+0

Parece que será de gran ayuda. No he podido llegar al proyecto hoy, pero les contaré cómo funciona cuando lo haga. Gracias. – gpe

Cuestiones relacionadas