#1 はじめに
以前の記事で書いた緯度・経度を反映したネットワーク図の描画について、少しずつ方法が分かってきたのでメモしておきます。
今回は、サンプルとして旧帝国大学とMARCH、関関同立の架空のネットワークデータを用意して、地図に記載しました。
参考にさせて頂いた方法は以下のとおりです。
- 「Rで学ぶデータサイエンス8 ネットワーク分析 第2版」(共立出版・2017年)第11章p302
- 同著著者の鈴木努先生のブログ記事(「地図上に航空路線を描く」)
#2 データの準備
まず、大学の座標(緯度・経度)とタイプ(国立・私立)を記載したcsvファイル「univ.csv」を用意します。
univ.csv↓
また、それぞれの大学の架空のネットワークを記載したcsvファイル「univnetwork.csv」を用意します。(下の部分が見切れています。本当はもう少しあります。)
univnetwork.csv↓
#3 コード
以下のとおり記載します。
#必要なパッケージの読み込み
library(network)
library(sna)
library(maps)
library(ggplot2)
library(GGally)
#データの読み込み(macで日本語が含まれたcsvデータを読み込む場合、「fileEncoding="CP932"」と記載。)
univs <- read.csv("univ.csv", header = TRUE,fileEncoding="CP932")
rownames(univs) <- univs$univ
reserch <- read.csv("univnetwork.csv", header = TRUE,fileEncoding="CP932")
#読み込んだデータをnetworkオブジェクト「reserch.net」に変換
reserch.net <- network(reserch[,1:2], directed = FALSE)
#networkオブジェクト「reserch.net」に、頂点の属性として、緯度(lat)、経度(lon)、国立・私立の別(type)、次数(degree)を与える。
reserch.net %v% "lat" <-
univs[network.vertex.names(reserch.net), "latitude"]
reserch.net %v% "lon" <-
univs[network.vertex.names(reserch.net), "longitude"]
reserch.net %v% "type" <-
as.character(univs[network.vertex.names(reserch.net), "type"])
reserch.net %v% "degree" <- degree(reserch.net, gmode = "graph")
#日本地図の描画に関する設定。
jpn <- ggplot(map_data("world2", "japan"), aes(x = long, y = lat)) +
geom_polygon(aes(group = group), color = "grey65",fill = "grey90")
#ggnetworkmap()関数で地図とネットワークを描画する。(大学の種類(国立・私立)を頂点の色、次数を頂点の大きさと輪郭の色で表す。)
ggnetworkmap(jpn, reserch.net, size = 7, node.group = type,
node.alpha = 0.6, weight = degree, ring.group = degree,
great.circle = TRUE, segment.color = "steelblue", segment.alpha = 0.4)
#5 今後の課題
- 凡例の日本語フォント(大学の種類(国立・私立))が表示されないため、表示させたい。
- 地図が横に伸びている感じがするので直したい。
- 大学のネットワークを記載したcsvファイル「univnetwork.csv」について、ソシオマトリックスの形式から直接networkオブジェクトに変換したい。
もし方法をご存知の方がいらっしゃいましたら、アドバイス頂けますと幸いです。
#6 追記1
ソシオマトリックスの形式からnetworkオブジェクトへの変換については、以下の方法でできました。
まず、以下のようなソシオマトリックスのcsvファイル「univnetwork2.csv」を用意します。
(各大学が3つのプロジェクト(P1,P2,P3)について、参画している場合は「1」、参画していない場合は「0」とする。)
univnetwork2.csv↓
そして、以下のとおり読み込み、行列に変換して転置行列を乗じてnetworkオブジェクトに変換します。
univ <- read.csv("univnetwork2.csv", row.names = "univ",fileEncoding="CP932")
univ <- as.matrix(univ)#行列に変換。
resultuniv <- univ%*%t(univ)#転置行列を乗じる。
reserch.net <- network(resultuniv, directed = FALSE)