1. Qiita
  2. Items
  3. networkx

MacでPython3環境をpyenvで作ってNetworkXのグラフを表示してみる

前説

前に取り込んだWikipediaのリンクデータで、PythonのNetworkXを使ってネットワーク図を表示しようと思ったのですが、環境構築に手間取ったので手順を残します。ちなみにNetworkXは、先週出たPython入門者の集いで知りました。

Homebrewのインストール

非常に初歩的なところからで恐縮ですが、Mac用のパッケージ管理ツールのHomebrewがインストールされているか、brewコマンドで確認します。

brew --version

まだインストールしていないようなら、Homebrewをインストールします。

/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
/master/install)"

インストールしていた場合は、最新版にアップデートます。

brew update

pyenv-virtualenvの環境作成

pyenv-virtualenvとは

Macには最初から2系のPythonが入ってますが、この環境を残しつつ、これからつくるプロジェクトは3系にしたいため、複数バージョンのPython環境を自動的に切り替えられるよう、pyenv-virtualenv をインストールします。

pyenvがPythonの複数環境切り替えツール(Simple Python version management )
virtualenvがPython公式のPython仮想環境ビルダー(Virtual Python Environment builder)

らしいので、pyenv-virtualenvは、pyenvからvirtualenvを使うライブラリということでしょうか。
ともかくpyenv-virtualenvで、任意のディレクトリをPythonの2系と3系に自動的に切り替えられるようになります。

pyenvやpyenv-virtualenvの環境構築は、Qiitaに既にたくさん解説があります。

pyenv-virtualenvのインストール

brew install pyenv-virtualenv

ちなみに、このインストールで、依存するpyenvも自動的にインストールされます。

$ brew install pyenv-virtualenv
==> Installing dependencies for pyenv-virtualenv: autoconf, pkg-config, openssl, readline, pyenv

pyenv-virtualenvの設定

インストールが終わったら環境変数を設定

~/.bash_profile
export PYENV_ROOT=$HOME/.pyenv
export PATH=$PYENV_ROOT/bin:$PATH
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"

環境変数の変更を反映して、

source ~/.bash_profile

pyenvでインストール可能なバージョンを表示してみます。

pyenv install --list

リストからPython3系の最新バージョンを探してインストールします。

pyenv install 3.5.1

こんな感じでwww.python.orgからPythonがダウンロード&インストールされます。

$ pyenv install 3.5.1
Downloading Python-3.5.1.tgz...
-> https://www.python.org/ftp/python/3.5.1/Python-3.5.1.tgz
Installing Python-3.5.1...

終わったらまた環境変数の変更を反映。

source ~/.bash_profile

作業用ディレクトリに移動してそのディレクトリではPython3.5.1が動くようにします。

cd [Python3用の任意の作業ディレクトリ]
pyenv local 3.5.1

おわったら、環境が切り替わることを確認します。

$ cd ~
$ python --version
Python 2.7.10

$ cd [Python3用の任意の作業ディレクトリ]
$ python --version
Python 3.5.1

pipのアップデート

これからNetworkXをインストールするのですが、インストールにはPythonのパッケージ管理システムのpipを使用します。Python3だとpipコマンドがディフォルトで付いてきますが、ディフォルトだと古いバージョンのようなのでアップデートしておきます。

cd [Python3用の任意の作業ディレクトリ]
pip install --upgrade pip
$ pip list
中略
pip (7.1.2)
中略

$ pip install --upgrade pip

$ pip list
中略
pip (8.0.2)
中略

NetworkXのインストール

NetworkXは、Pythonで複雑ネットワークを扱うためのライブラリです。

NetworkX is a Python language software package for the creation, manipulation, and study of the structure, dynamics, and functions of complex networks.

cd [Python3用の任意の作業ディレクトリ]
pip install networkx

インストールが終わると.pyenv/versions/3.5.1以下にnetworkxのモジュールが配置されたようです。

$ ls ~/.pyenv/versions/3.5.1/lib/python3.5/site-packages/networkx
__init__.py     classes         drawing         generators      relabel.py      tests
__pycache__     convert.py      exception.py        linalg          release.py      utils
algorithms      convert_matrix.py   external        readwrite       testing         version.py

$ ls ~/.pyenv/versions/3.5.1/share/doc/networkx-1.11/examples
3d_drawing  advanced    algorithms  basic       drawing     graph       multigraph  pygraphviz

NetworkXでコンソール表示をしてみる

試しに、NetrowkXのサイトに載っている最初のサンプルを動かしてみます。

networkx-sample.py
import networkx as nx

G=nx.Graph()
G.add_node("spam")
G.add_edge(1,2)

print(G.nodes())
print(G.edges())

Python3に設定した環境にnetworkx-sample.pyスクリプトを作って実行します。

$ cd [Python3用の任意の作業ディレクトリ]
$ python networkx-sample.py 
['spam', 2, 1]
[(2, 1)]

ネットワークのノードとエッジがコンソール表示されました。

matplotlibのインストール

次に公式サイトからネットワークをグラフィカルに表示しているサンプルを探して実行してみようと思いますが、グラフ表示にはmatplotlibライブラリが必要なようです。

またpipコマンドでインストールします。

pip install matplotlib

ここままサンプルを実行するとエラーになります。エラーメッセージが指しているのはこのページでしょうか?

RuntimeError: Python is not installed as a framework. The Mac OS X backend will not be able to function correctly if Python is not installed as a framework. 
See the Python documentation for more information on installing Python as a framework on Mac OS X. Please either reinstall Python as a framework, or try one of the other backends. 
If you are Working with Matplotlib in a virtual enviroment see 'Working with Matplotlib in Virtual environments' in the Matplotlib FAQ

(エラーメッセージは1行が長いので改行しています。)

書いてある通りにやっても解決しなかったので、Qiitaから解決方法を探します。
参考:VirtualEnv環境でmatplotlibなどがimportできない

matplotlibrcファイルを新規作成

~/.matplotlib/matplotlibrc

matplotlibrcに1行記述

backend : TkAgg

NetworkXでネットワーク図を表示をしてみる

公式サイトのサンプルRandom Geometric GraphをコピペしてPythonスクリプトを作成します。

RandomGeometricGraph.py
import networkx as nx
import matplotlib.pyplot as plt

G=nx.random_geometric_graph(200,0.125)
# position is stored as node attribute data for random_geometric_graph
pos=nx.get_node_attributes(G,'pos')

# find node near center (0.5,0.5)
dmin=1
ncenter=0
for n in pos:
    x,y=pos[n]
    d=(x-0.5)**2+(y-0.5)**2
    if d<dmin:
        ncenter=n
        dmin=d

# color by path length from node near center
p=nx.single_source_shortest_path_length(G,ncenter)

plt.figure(figsize=(8,8))
nx.draw_networkx_edges(G,pos,nodelist=[ncenter],alpha=0.4)
nx.draw_networkx_nodes(G,pos,nodelist=p.keys(),
                       node_size=80,
                       node_color=[float(v) for v in p.values()],
                       cmap=plt.cm.Reds_r)

plt.xlim(-0.05,1.05)
plt.ylim(-0.05,1.05)
plt.axis('off')
plt.savefig('random_geometric_graph.png')
plt.show()

そのままだとPython3で動かなかったので、1行変更しています。

original

node_color=p.values()

こう変えました。多分2系と3系の違いなのだと思いますが、matplotlibのバージョンが原因かもしれません。

node_color=[float(v) for v in p.values()]

サンプルを実行

サンプルを実行すると何やらネットワーク図が表示されて、random_geometric_graph.pngファイルが作成されました。

python RandomGeometricGraph.py

スクリーンショット 2016-02-01 14.38.15.png

::...
免责声明:
当前网页内容, 由 大妈 ZoomQuiet 使用工具: ScrapBook :: Firefox Extension 人工从互联网中收集并分享;
内容版权归原作者所有;
本人对内容的有效性/合法性不承担任何强制性责任.
若有不妥, 欢迎评注提醒:

或是邮件反馈可也:
askdama[AT]googlegroups.com


订阅 substack 体验古早写作:


点击注册~> 获得 100$ 体验券: DigitalOcean Referral Badge

关注公众号, 持续获得相关各种嗯哼:
zoomquiet


自怼圈/年度番新

DU22.4
关于 ~ DebugUself with DAMA ;-)
粤ICP备18025058号-1
公安备案号: 44049002000656 ...::