Rでお遊び:「globe」パッケージの出力をインタラクティブに拡大縮小する方法

Rの解析に役に立つ記事
スポンサーリンク

「globe」パッケージの出力を「svgPanZoom」と「SVGAnnotation」パッケージで拡大・縮小が可能なプロットにする方法を紹介します。

なお、台風経路はJAXAの台風データベースで紹介されているユニシス社のデータを「XML」と「RCurl」パッケージを利用して取得しています。

・JAXAの台風データベース
 http://sharaku.eorc.jaxa.jp/TYP_DB/database_j.html

・ユニシス社のデータ
 http://weather.unisys.com/hurricane/

・「svgPanZoom」と「SVGAnnotation」パッケージの紹介
 https://www.karada-good.net/analyticsr/r-154/

・「globe」パッケージ
 https://www.karada-good.net/analyticsr/r-383/

実行コマンドはR version 3.2.2で確認しています。

スポンサーリンク

実行コマンド

詳細はコメント、各パッケージのヘルプを確認してください。

#パッケージの読み込み
#globeパッケージがなければインストール
if(!require("globe", quietly = TRUE)){
  install.packages("globe");require("globe")
}
#svgPanZoomパッケージがなければインストール
if(!require("svgPanZoom", quietly = TRUE)){
  install.packages("svgPanZoom");require("svgPanZoom")
}
#SVGAnnotationパッケージがなければインストール
if(!require("SVGAnnotation", quietly = TRUE)){
  devtools::install_github("duncantl/SVGAnnotation");require("SVGAnnotation")
}
#XMLパッケージがなければインストール
if(!require("XML", quietly = TRUE)){
  install.packages("XML");require("XML")
}
#RCurlパッケージがなければインストール
if(!require("RCurl", quietly = TRUE)){
  install.packages("RCurl");require("RCurl")
}

#JAXAの台風データベースを参考:http://sharaku.eorc.jaxa.jp/TYP_DB/database_j.html
#ユニシス社:http://weather.unisys.com/hurricane/からデータを取得
#2015年のデータURLを設定
SelectURL <- "http://weather.unisys.com/hurricane/w_pacific/2015/index.php"
#&#12506;&#12540;&#12472;&#20869;&#23481;&#12434;&#21462;&#24471;
doc <- getURL(SelectURL)
#&#20869;&#23481;&#12434;parse
doc <- htmlParse(doc)
#&#12506;&#12540;&#12472;&#20869;&#12398;&#12522;&#12531;&#12463;&#12434;&#21462;&#24471;
Listhref <- xpathSApply(doc, "//li/a", xmlGetAttr, 'href')
Dthref <- xpathSApply(doc, "//td/a", xmlGetAttr, 'href')
#&#12487;&#12540;&#12479;&#12522;&#12531;&#12463;&#12434;&#25277;&#20986;
Allhref <- c(Listhref[grep("\\.dat$", Listhref)], Dthref[grep("\\.dat$", Dthref)])
#&#12487;&#12540;&#12479;&#12398;&#21462;&#24471;
MasterData <- NULL
for(i in seq(Allhref)){
  #&#12487;&#12540;&#12479;&#12522;&#12531;&#12463;&#12434;&#35373;&#23450;
  GetData <- paste0("http://weather.unisys.com/hurricane/w_pacific/2015/", Allhref[i])
  #&#21488;&#39080;&#21517;&#12434;&#21462;&#24471;
  Name <- unlist(strsplit(Allhref[i], "/"))[1]
  #&#12487;&#12540;&#12479;&#12434;&#35501;&#12415;&#36796;&#12415;
  Data <- readLines(GetData)
  #&#24517;&#35201;&#12398;&#12394;&#12356;&#12487;&#12540;&#12479;&#12434;&#21066;&#38500;
  Data <- Data[4:length(Data)]
  #&#12487;&#12540;&#12479;&#26684;&#32013;&#29992;&#12398;&#22793;&#25968;&#12434;&#28310;&#20633;
  SubMasterData <- NULL
  #&#36899;&#32154;&#20966;&#29702;
  for(m in seq(length(Data))){
    #&#35501;&#12415;&#36796;&#12435;&#12384;&#12487;&#12540;&#12479;&#12434;&#31354;&#30333;&#12372;&#12392;&#12395;&#25991;&#23383;&#12434;&#20998;&#21106;
    GetStrings <- unlist(strsplit(Data[m], " "))
    #&#25991;&#23383;&#12364;&#23384;&#22312;&#12375;&#12394;&#12356;&#12487;&#12540;&#12479;&#12434;&#21066;&#38500;
    GetStrings <- GetStrings[grep(".", GetStrings)]
    #&#21488;&#39080;&#21517;&#12392;&#32080;&#21512;
    GetStrings <- c(Name, GetStrings)
    #&#20998;&#21106;&#12373;&#12428;&#12427;STAT&#12487;&#12540;&#12479;&#12434;&#32080;&#21512;&#20966;&#29702;
    if(length(GetStrings) > 8){
      #&#20998;&#21106;&#12373;&#12428;&#12383;&#22580;&#21512;
      GetStrings <- c(GetStrings[1:7], paste0(GetStrings[8:length(GetStrings)], collapse = "-"))
      SubMasterData <-  rbind(SubMasterData, matrix(GetStrings, ncol = 8))
      
    } else {
      #&#20998;&#21106;&#12373;&#12428;&#12394;&#12356;&#22580;&#21512;
      SubMasterData <-  rbind(SubMasterData, matrix(GetStrings, ncol = 8))
      
    }}
  
  #&#12487;&#12540;&#12479;&#12434;&#32080;&#21512;
  MasterData <-  rbind(MasterData, SubMasterData)
  
}

#&#21462;&#24471;&#12487;&#12540;&#12479;&#12434;data.frame&#21270;
MasterData <- as.data.frame(MasterData)
#&#12487;&#12540;&#12479;&#21517;&#12434;&#20184;&#19982;
names(MasterData) <- c("NAME", "ADV", "LAT", "LON", "TIME", "WIND", "PR", "STAT")

###&#21462;&#24471;&#12375;&#12383;&#12487;&#12540;&#12479;&#12363;&#12425;&#25313;&#22823;&#12364;&#21487;&#33021;&#12394;&#22320;&#29699;&#20736;&#12503;&#12525;&#12483;&#12488;&#12434;&#20316;&#25104;#####
#&#21488;&#39080;&#32076;&#36335;&#12434;&#12503;&#12525;&#12483;&#12488;&#29992;&#12395;&#22793;&#24418;
TyphoonPoint <- t(apply(MasterData[ , 4:3], 1, function(x) as.numeric(as.character(x))))

#&#12452;&#12531;&#12479;&#12521;&#12463;&#12486;&#12451;&#12502;&#12395;&#12503;&#12525;&#12483;&#12488;
svgPanZoom(svgPlot(
  {
    #&#26413;&#24140;&#12434;&#20013;&#24515;
    LonLatData <- ensurelonlat(c(141.21, 43.3))
    #&#31354;&#12398;&#22320;&#29699;&#20736;&#12434;&#12503;&#12525;&#12483;&#12488;
    globeearth(eye = LonLatData, top = place("northpole"))
    #&#21488;&#39080;&#32076;&#36335;&#12434;&#12503;&#12525;&#12483;&#12488;
    globepoints(loc = TyphoonPoint, eye = LonLatData, top = place("northpole"),
                col = rgb(0.4, 0.3, 0.5, alpha = 0.5), pch = 17, cex = .5)
  }
))

出力例

拡大・縮小・移動が可能です。


少しでも、あなたの解析が楽になりますように

タイトルとURLをコピーしました