Help us understand the problem. What is going on with this article?

地図上に大学間のネットワーク図を書く

1 はじめに

以前の記事で書いた緯度・経度を反映したネットワーク図の描画について、少しずつ方法が分かってきたのでメモしておきます。

今回は、サンプルとして旧帝国大学とMARCH、関関同立の架空のネットワークデータを用意して、地図に記載しました。
参考にさせて頂いた方法は以下のとおりです。

  • 「Rで学ぶデータサイエンス8 ネットワーク分析 第2版」(共立出版・2017年)第11章p302
  • 同著著者の鈴木努先生のブログ記事(「地図上に航空路線を描く」)

2 データの準備

まず、大学の座標(緯度・経度)とタイプ(国立・私立)を記載したcsvファイル「univ.csv」を用意します。
univ.csv↓
スクリーンショット 2020-01-26 12.09.06.png

また、それぞれの大学の架空のネットワークを記載したcsvファイル「univnetwork.csv」を用意します。(下の部分が見切れています。本当はもう少しあります。)
univnetwork.csv↓
スクリーンショット 2020-01-26 12.08.34.png

3 コード

以下のとおり記載します。

R
#必要なパッケージの読み込み
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)

4 出力結果

こんな感じで出力されます。
スクリーンショット 2020-01-26 12.27.19.png

5 今後の課題

  • 凡例の日本語フォント(大学の種類(国立・私立))が表示されないため、表示させたい。
  • 地図が横に伸びている感じがするので直したい。
  • 大学のネットワークを記載したcsvファイル「univnetwork.csv」について、ソシオマトリックスの形式から直接networkオブジェクトに変換したい。

もし方法をご存知の方がいらっしゃいましたら、アドバイス頂けますと幸いです。

6 追記1

ソシオマトリックスの形式からnetworkオブジェクトへの変換については、以下の方法でできました。
まず、以下のようなソシオマトリックスのcsvファイル「univnetwork2.csv」を用意します。
(各大学が3つのプロジェクト(P1,P2,P3)について、参画している場合は「1」、参画していない場合は「0」とする。)
univnetwork2.csv↓
スクリーンショット 2020-01-26 17.18.35.png

そして、以下のとおり読み込み、行列に変換して転置行列を乗じてnetworkオブジェクトに変換します。

R
univ <- read.csv("univnetwork2.csv", row.names = "univ",fileEncoding="CP932") 
univ <- as.matrix(univ)#行列に変換。
resultuniv <- univ%*%t(univ)#転置行列を乗じる。
reserch.net <- network(resultuniv, directed = FALSE)

あとは、先ほどと同様の方法で出力します。
結果、以下のように出力されます。
スクリーンショット 2020-01-26 12.27.19.png

restructure
Rの学習を始めたばかりです。 わからないことばかりですが、よろしくお願いします。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした