イベント名 都道府県名 開催 協賛会社 企画会社 運営会社
〇〇祭り 北海道 1989 F社 A社、D社 G社
となっていた場合、F社、A社、D社、G社 が関係があるとし、その中の2つの組み合わせに対して辺を追加する形でグラフを作成しました。(itertools.combinations を使用)
G社 A社
G社 F社
G社 D社
A社 F社
A社 D社
F社 D社
関係の強さを表すために penwidth 属性に回数を記録し、すでに辺が存在する場合は +1 するようにしました。(penwidth 属性は Graphviz で辺を描画する際の太さに利用されます)
必要なライブラリについて
netoworkx 自体はグラフの可視化機能は提供しておらず、matplotlib または Graphviz を使って行うので、今回は Graphviz を使いました。
可視化には別途、pydot
という Python のライブラリと graphviz
というソフトウェアが必要になります。
Linux では apt でインストールできますが、それ以外の環境の場合は OS にあったバージョンのバイナリを公式サイトからダウンロードしてください。
Download
pydot は pip install pydot
でインストールできます。
Linux の場合のコマンド
bash
1pip install pydot networkx
2# Graphviz と日本語フォントをインストール
3apt install -y graphviz fonts-ipafont
4fc-cache -fv
コード
python
1from io import StringIO
2from itertools import combinations
3
4import networkx as nx
5import pandas as pd
6from IPython.display import Image, display
7
8data = StringIO(
9 """
10イベント名,都道府県名,開催,協賛会社,企画会社,運営会社
11〇〇祭り,北海道,1989,F社,A社、D社,G社
12□□大会,北海道,1975,A社、H社,B社,H社
13△△パーティー,東京都,2013,A社,C社、D社,B社、F社
14●●祭,神奈川県,1982,B社,E社、F社、A社,G社
15✖︎✖︎生誕祭,大阪府,1969,F社,G社、B社,A社
16■■ディナーショー,大阪府,2004,A社、G社,C社,A社、C社、H社
17▲▲イベント,沖縄,1997,B社,D社、E社、F社,H社
18"""
19)
20
21
22def splitter(text):
23 """句読点区切りの値をリストにする。
24 例: "A社、D社" -> ["A社", "D社"]
25 """
26 return [x.strip() for x in text.split("、")]
27
28
29df = pd.read_csv(
30 data, converters={"協賛会社": splitter, "企画会社": splitter, "運営会社": splitter}
31)
32display(df)
33
34# 会社は全部ひとまとめにする。
35df["会社"] = df["協賛会社"] + df["企画会社"] + df["運営会社"]
36# 重複は消す。
37df["会社"] = df["会社"].apply(lambda x: set(x))
38
39# 会社の関係をグラフにする。
40G = nx.Graph(fontname="IPAGothic") # 日本語フォントを設定する
41# 環境に応じて、ここは変えてください。Windows なら例えば「メイリオ」とか
42
43for row in df.itertuples():
44 # 各イベントごとに、関係している会社の組み合わせを辺として追加する。
45 for u, v in combinations(getattr(row, "会社"), 2):
46 if G.has_edge(u, v):
47 # すでに辺が存在する場合は penwidth の値を +1 する。
48 G.edges[u, v]["penwidth"] += 1
49 else:
50 # 辺がまだ存在しない場合は辺を追加する。
51 G.add_edge(u, v, penwidth=1)
52
53
54def show_graph(G):
55 D = nx.nx_pydot.to_pydot(G)
56 D.write_png("temp.png", prog="dot")
57 display(Image("temp.png"))
58
59
60show_graph(G)
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2020/01/23 06:51
2020/01/23 07:01
退会済みユーザー
2020/01/23 07:14
2020/01/23 07:21 編集
退会済みユーザー
2020/01/23 07:23
2020/01/23 07:30
退会済みユーザー
2020/01/23 07:37
2020/01/23 07:42
退会済みユーザー
2020/01/23 07:44
2020/01/23 07:54 編集