8

Flowing Dataの大円マッピング チュートリアルで学んだことのいくつかを取り上げ、それらをコメントにリンクされているコードと組み合わせて、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()
}

ATL とグローバル ネットワーク内の他の空港との間で共有される、予定されているすべての商用ルート (ダミー サンプル)を含む大規模なデータセットのマップの作成を自動化したいと考えています (airports.csv は Flowing Data の投稿でリンクされています)。できれば、アトランタ空港のネットワーク スペースの変化を示す短いビデオのフレームとして使用する 1 か月に 1 つのマップを作成します。

問題:ループを実行するたびに、各 CSV の最初の一意の月のみから複数の PNG を生成するループを取得できません。Aaron Hardin のコードは、Flowing Data チュートリアルで使用されている自動化を「壊す」と確信しています。それをいじり、関連する R のハウツーを追い求めて 3 日間過ごした後、私は単に 1 つを他のものと調整するためのチョップが不足していることに気付きました。プロセスの自動化を手伝ってくれる人はいますか?

その中に論文の謝辞があります!

4

1 に答える 1

13

コメントするには情報が多すぎるため、代わりに回答を投稿します。これが私が思うことです(そして最後まで読んで、何が問題になる可能性があるかを確認してください):

フロー データ チュートリアルの元のデータでコードを実行しようとしました。(明らかに、毎月のデータの列を追加する必要があるため、月をランダム化するためにこの行を追加しただけです:):

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. 私は使用しますmessage

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

とにかく、私はあなたのコードを実行しました。すべてが正確に機能します。4 か月分のデータをサンプリングしたので、次のようになります。

  • i の現在の反復を含むメッセージは 4 回出力されます
  • 4 つpngのプロット。それぞれに暗い世界地図と明るい黄色の線があります。以下は、4 つの行のうちの 1 つです。

ここに画像の説明を入力


では、なぜ私のマシンでは機能するのに、あなたのマシンでは機能しないのでしょうか?

推測しかできませんが、作業ディレクトリを設定していないと思います。コードには no がありsetwd、への呼び出しpngはファイル名を与えるだけです。システム内の作業ディレクトリにコードが書き込まれていると思われます。

デフォルトでは、私のインストールでは、作業ディレクトリは次のとおりです。

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

これを解決するには、次のいずれかを実行します。

  1. setwd()スクリプトの先頭に作業ディレクトリを設定するために使用します。
  2. または、呼び出しでフル パスとファイル名を使用します。png()
于 2011-08-30T12:14:39.077 に答える