2011-08-30 21 views
8

Tôi đã lấy một số điều tôi đã học trong một dữ liệu Flowing great circle mapping tutorial và kết hợp chúng với mã được liên kết trong các nhận xét để ngăn những điều kỳ lạ xảy ra khi R vẽ các vòng tròn lớn xích đạo. Điều đó mang lại cho tôi điều này:Tự động hóa việc tạo bản đồ vòng tròn lớn trong 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ôi muốn tự động hóa sản xuất bản đồ cho một tập dữ liệu lớn chứa tất cả các tuyến thương mại dự kiến ​​- dummy sample - chia sẻ giữa ATL và các sân bay khác trong mạng lưới toàn cầu (airports.csv được liên kết trong bài đăng Dữ liệu luồng). Tốt hơn là, tôi sẽ tạo một bản đồ mỗi tháng mà tôi sẽ sử dụng làm khung trong video ngắn mô tả các thay đổi trong không gian mạng sân bay Atlanta.

Vấn đề: Tôi không thể tạo vòng lặp để tạo ra nhiều hơn một PNG — chỉ từ tháng duy nhất đầu tiên trong mỗi CSV — mỗi khi tôi chạy nó. Tôi khá chắc chắn mã của Aaron Hardin 'phá vỡ' tự động hóa như nó được sử dụng trong hướng dẫn dữ liệu chảy. Sau ba ngày lộn xộn với nó và đuổi theo bất kỳ R có liên quan như thế nào, tôi nhận ra tôi chỉ đơn giản là thiếu các sườn để hòa giải với người kia. Ai có thể giúp tôi tự động hóa quá trình?

Có ghi nhận luận án trong đó dành cho bạn!

+1

Bạn thấy rất nhiều mã. Cố gắng tạo một ví dụ * tối thiểu mà vẫn không hoạt động. Ví dụ, tạo một vòng lặp đơn giản vẽ một loạt các biểu đồ rất đơn giản. Thậm chí đơn giản hơn, hãy để mỗi vòng lặp đơn giản in giá trị của 'i' và' monthyear [i] '. Tôi đặt cược trong quá trình bạn sẽ tìm thấy lỗi. Nếu không, hãy đăng ví dụ * tối thiểu * và ai đó sẽ có thể giúp bạn. – Andrie

+0

Bạn có thể sử dụng định dạng đầu ra 'pdf() 'và sử dụng tháng năm làm nhãn chính, theo cách này bạn không phải mở và đóng kết nối đầu ra tệp mỗi lần trong vòng lặp của bạn. – mzuba

+0

@mzuba Có, nhưng sau đó bạn chỉ nhận được một tệp pdf duy nhất, chứ không phải là tệp cho từng ô. – Andrie

Trả lời

13

Quá nhiều thông tin cho nhận xét, vì vậy tôi đăng câu trả lời thay thế. Dưới đây là những gì tôi nghĩ (và đọc đến cùng để xem những gì có thể có khả năng là vấn đề):

Tôi đã cố gắng chạy mã của bạn trên dữ liệu gốc trong hướng dẫn Dữ liệu chảy. (Rõ ràng là bạn phải thêm một cột trong dữ liệu hàng tháng, vì vậy tôi chỉ cần thêm dòng này để randomise tháng :):

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) 

Bất cứ khi nào tôi có một vòng lặp mà phải mất một thời gian dài để chạy, tôi thường dính một chút mã trong đó cung cấp cho tôi một kiểm tra tiến độ. Sử dụng những gì bạn thích: print, cat, tcltk::tkProgressBar. Tôi sử dụng message:

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

Dù sao, tôi sau đó chạy mã của bạn. Tất cả mọi thứ hoạt động chính xác như nó cần. Kể từ khi tôi lấy mẫu bốn tháng giá trị của dữ liệu, tôi nhận được:

  • Thông điệp với lần lặp hiện tại của tôi in gấp bốn lần
  • Bốn png lô, mỗi với một bản đồ thế giới tối tăm và dây chuyền vàng tươi. Đây là một trong bốn dòng:

enter image description here


Vì vậy, tại sao nó hoạt động trên máy tính của tôi và không phải của bạn?

Tôi chỉ có thể đoán, nhưng tôi đoán là bạn chưa đặt thư mục làm việc. Không có mã số setwd trong mã của bạn và lệnh gọi tới số png chỉ cung cấp tên tệp. Tôi nghi ngờ mã của bạn đang được ghi vào thư mục làm việc của bạn trong hệ thống của bạn.

Theo mặc định, vào cài đặt của tôi, thư mục làm việc là:

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

Để giải quyết việc này, thực hiện một trong các cách sau:

  1. Sử dụng setwd() để thiết lập thư mục làm việc của bạn ở đầu kịch bản của bạn.
  2. Hoặc sử dụng đường dẫn đầy đủ và tên file trong lệnh gọi png()
+1

+1 cho câu trả lời kỹ lưỡng (như thường lệ!) – Ramnath

+0

Điều này có vẻ như đó sẽ là một trợ giúp lớn. Tôi đã không thể đến dự án ngày hôm nay nhưng tôi sẽ cho bạn biết nó như thế nào khi tôi làm. Cảm ơn. – gpe

Các vấn đề liên quan