LoginSignup
23

More than 5 years have passed since last update.

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

Posted at

前説

前に取り込んだ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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
23