PyGraphvizをWindows10にインストールする方法（2022年版)

PyGraphvizをWindowsにインストールする手順が少し複雑だったので簡単にまとめておきます．
# PyGraphvizとは
- GraphvizをPythonで使うためのインターフェース
- Graphvizの豊富なグラフ描画レイアウトをNetworkXと連携できて便利
- PyGraphvizの[公式サイト](https://pygraphviz.github.io/)

NetworkXでは座標指定をしないと位置関係が理解しづらいグラフでも，
PyGraphvizを使うと座標指定をすることなく，見やすく描画することができます！

__NetworkX のみ__
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2367348/f9735fd4-1598-43b7-a2f7-42cb14cbb0eb.png" width="65%">
__PyGraphviz__
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2367348/7fd0b6a8-b7d5-ba34-8b15-7a33199699b0.png)

# インストール手順
目次の順番にインストールをしていきます．
## 環境
以下の環境で実行しました．
- Windows 10
- Python 3.9.7
- Graphviz 6.0.2
- PyGraphviz 1.10
## 用意するもの
- Python（バージョン 3.8, 3.9, 3.10）
- Graphviz (バージョン 2.42 以降）
- Microsoft C++ Build Tools（PyGraphvizを動かすためにC/C++のコンパイラが必要）

## 1. Graphviz
[Graphviz公式](https://graphviz.org/download/)のダウンロードページへアクセス

Windows用の項目で[graphviz-6.0.2 (64-bit) EXE installer [sha256]](https://gitlab.com/api/v4/projects/4207231/packages/generic/graphviz-releases/6.0.2/windows_10_cmake_Release_graphviz-install-6.0.2-win64.exe) をダウンロード．
　　　　　　　　　　↑このリンクからでもダウンロードできます．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2367348/2e88e76f-7e5c-ec48-f16f-9c0e61f371b3.png)
１．インストールできたら実行します．指示に従いそのまま進んでいきます．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2367348/d6810ae2-5964-ce47-c6dc-84f084f01fa3.png)
２．ここで**ユーザー環境変数にGraphvizのパスを通しておく**と後が楽になります．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2367348/eba88e47-efd2-c042-a61d-c9919cddff0f.png)
３．インストール先のフォルダを指定します．
ここで指定したパス **C:\Program Files\Graphviz** を覚えておきます．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2367348/0d1ce871-e413-cb90-897c-fd6776f92345.png)
４．インストール完了
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2367348/04c52d54-a8e6-dbcb-b2a2-69915bce2eab.png)
これでGraphvizのインストールは完了です．

## 2. Microsoft C++ Build Tools
次にPyGraphvizを動かすために，C++のコンパイラを[ダウンロード](https://visualstudio.microsoft.com/ja/thank-you-downloading-visual-studio/?sku=Community&channel=Release&version=VS2022&source=VSLandingPage&cid=2030&passive=false
)します．

ダウンロードが開始されます．
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2367348/1b6cb579-7b5c-0aa0-29b8-9ce54b2507d2.png">
実行するとこのような画面になります．
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2367348/4c94b5fc-fd66-361e-793b-fb3a99fa99cc.png" width="65%">
インストールを待ちます．
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2367348/2eba8d0e-a180-b782-612d-3bfd53d8f0d9.png" width="65%">
インストーラが起動されるとこの画面が表示されるので，以下のオプションでインストールをします．
![スクリーンショット 2022-10-27 143315.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2367348/4a0c1583-045f-751d-6749-d72d73c5e15b.png)
ダウンロードが始まります．
![MicrosoftTeams-image (4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2367348/231d373c-df61-9686-5189-ce3761d06d4d.png)
以上でC++コンパイラのインストールは終了です．

## 3. PyGraphvizをインストール
[PyGraphviz公式ドキュメント](https://pygraphviz.github.io/documentation/stable/install.html)に従って，このようなコマンドでインストールします．
```console
$ pip install --global-option=build_ext --global-option="-IC:\Program Files\Graphviz\include" --global-option="-LC:\Program Files\Graphviz\lib" pygraphviz
```
オプションでGraphvizのインストール先を指定し，Graphvizを読み込んでからPyGraphvizをインストールするコマンドです．
今回は`C:\Program Files\Graphviz`にGraphvizをインストールした場合を想定しているので，各自の環境に応じて
- IC:\Program Files\Graphviz\include
- LC:\Program Files\Graphviz\lib

の部分は変更する必要があります．
※1回目の実行で上手くいかない場合がありますが，もう一度実行するとSuccessfully installed pygraphviz-1.10となります．

__インストールできたかの確認__

```console
$ pip show pygraphviz
----------------------------------------------------
Name: pygraphviz
Version: 1.10
Summary: Python interface to Graphviz
Home-page: http://pygraphviz.github.io
Author: Aric Hagberg
Author-email: aric.hagberg@gmail.com
License: BSD
Location: c:\users\nabe6\anaconda3\lib\site-packages
Requires: 
Required-by:
```
バージョン1.10のPyGraphvizがインストールされていることが確認できました．
これでPyGraphvizのインストールは完了です．

## 4. 実際にNetworkXと連携してみる
NetworkXで作ったグラフを実際にpygraphvizで書き直してみます．

__グラフ作成とライブラリの準備__
```python
import networkx as nx
import random
from networkx.drawing.nx_agraph import graphviz_layout
random.seed(0) # seed値を0に固定
G = nx.DiGraph([(1,2),(1,3),(2,4),(2,5),(3,6)]) # 1から2，1から3へのエッジとなるような有向グラフの作成
```
__Networkxのみで描画した場合__
```python:networkx
nx.draw(G,with_labels=True)
```
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2367348/f9735fd4-1598-43b7-a2f7-42cb14cbb0eb.png" width="65%">

__PyGraphvizで書き直した場合__
```python:pygraphviz
pos = graphviz_layout(G,prog="dot") # 描画レイアウトの指定 Graphvizの"dot"というレイアウトを使用
nx.draw(G,pos=pos,with_labels=True) # pos=posでGraphvizのレイアウト通りのグラフを描画
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2367348/7fd0b6a8-b7d5-ba34-8b15-7a33199699b0.png)
`prog="dot"`はGraphvizの描画レイアウトで，有向グラフを階層的に描画することができます．
"dot"の他にも，GraphvizにはNetworkXだけでは描けないような豊富な描画レイアウトが揃っているので，PyGraphvizを使ってきれいなグラフを描く際の参考になればいいなと思います．
- 他のレイアウトの公式ドキュメントは[こちら](https://graphviz.org/docs/layouts/)

# 参考資料
https://self-development.info/pygraphviz%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%82%92%E3%82%8F%E3%81%8B%E3%82%8A%E3%82%84%E3%81%99%E3%81%8F%E8%A7%A3%E8%AA%AC%E3%80%90python%E3%80%91/