(O+P)ut

アウトプット



(O+P)ut

エンジニアのアウトプット

【R言語】二次元配列を3次元の点群で可視化する

スポンサーリンク

はじめに

以下記事にて二次元配列をpersp関数で可視化する流れを記載しました。

一方で違う見せ方としてscatterplot3d関数で可視化することも可能です。

本記事ではperspに関する記事で利用したアメリカの航空会社から提供されている1949年から12年間の国際線旅客数の月毎の合計AirPassengersを利用して点群として可視化します。

scatterplot3d用にデータを3次元に変換する

matrixを用いてデータを一列に格納します。

> matrix(AirPassengers)
       [,1]
  [1,]  112
  [2,]  118
  [3,]  132
  [4,]  129
  [5,]  121
...
[140,]  606
[141,]  508
[142,]  461
[143,]  390
[144,]  432

これを3次元データに格納すべくループ処理を回します。

for(i in 1:12){
 for(j in 1:12){
  if(i==1 && j==1){
   air <- c(i,j,airpass[(i-1)*12+j])
  }
  else{
   air <- rbind(air,c(i,j,airpass[(i-1)*12+j]))
  }
 }
}

3次元配列airの中身を確認すると確かに3次元です。

> head(air)
    [,1] [,2] [,3]
air    1    1  112
       1    2  118
       1    3  132
       1    4  129
       1    5  121
       1    6  135

データを描画する

描画コマンドを押下すれば表示されます。

scatterplot3d(air,xlab="",ylab="",zlab="",pch =20,type="p",zlim=c(0,max(airpass)))

f:id:mtiit:20190904182303p:plain
AirPassengersの3Dプロット

色付け描画

さらにscatterplot3dの特徴である任意の点に色をつけれることを試します。
Airpassangersの平均値より大きい点はピンク、小さい点は茶色にしてみます。

> mean(AirPassengers)
[1] 280.2986

値を格納する際に条件分岐を追加し、色情報を4列目に格納します。

if(airpass[(i-1)*12+j]>mean(airpass)){
   air <- rbind(air,c(i,j,airpass[(i-1)*12+j],"#ff7fbf"))
  }
  else{
   air <- rbind(air,c(i,j,airpass[(i-1)*12+j],"#6c3524"))
  }

確かに4次元情報として格納されています。

> head(air)
    [,1] [,2] [,3]  [,4]     
air "1"  "1"  "112" "#6c3524"
    "1"  "2"  "118" "#6c3524"
    "1"  "3"  "132" "#6c3524"
    "1"  "4"  "129" "#6c3524"
    "1"  "5"  "121" "#6c3524"
    "1"  "6"  "135" "#6c3524"

描画する際にデータ部分air[,1:3]と色部分air[,4]を意識して描画すれば

scatterplot3d(air[,1:3],color=air[,4],xlab="",ylab="",zlab="",pch =20,type="p",zlim=c(0,max(airpass)))

以下となります。

f:id:mtiit:20190904183253p:plain
AirPassengersの3Dプロット色付き

終わりに

二次元配列を可視化する手法は多々ありますが、今回は3次元の点群としてプロットしてました。
個人的には値が少ない場合はperspの方が見やすい気がしますが、場合によっては力を発揮する可視化方法なので覚えておくとどこかで役立つと思います。