Pythonでnetworkxを使ってグラフを書く

Python学習【365日チャレンジ!】171日目のマスターU(@Udemy11)です。

Weathernewsの雨雲レーダーを見て、少し時間が経つと雨が降りそうだと思ったので、早めに家を出たところ、出かける予定の時間になっても雨がふらなかったので、予定どおりで良かったな〜と思ってしまいました。

映画の【Back to the Future2】で、マーティーがタイムスリップした未来の世界は2015年で、今からするとすでに過去になっていますが、リアルタイムで天気がわかる世の中になっていました。

2020年の現在でもそこまでピンポイントで天気予報がわかるわけではありませんが、雨雲レーダーを使えばある程度雨の予想はできる世の中になっています。

とはいえ、天候を読むのは難しいですね。

それでは今日もPython学習を始めましょう。

昨日の復習

昨日は、サーバーに処理を任せることができるXMLRPCを学習しました。

非常に簡単なコードでしたが、サーバー側で足し算の関数を用意しておき、クライアントから変数を受け取って処理をしたあと回答を返しました。

サーバーが非力の場合は高負荷な処理はできませんが、単純な処理をサーバーにさせることで、クライアント側の負担を減らすことができました。

詳しくは、昨日の記事をごらんください。

今日は、ネットワークをグラフで表すことができるnetworkxを学習しましょう。

networkxとは

networkxは、グラフネットワークを扱うライブラリの1つで、通信ネットワークや物流ネットワーク、鉄道ネットワークやエネルギーネットワークを目に見える形に表すことができ、最短路問題や最大マッチング問題の解決に活用することができます。

グラフネットワークについては、こちらのページが参考になります。

頭の中を整理することができるマインドマップに似たようなものとして、データの関係をわかりやすく表すことができちゃうわけです。

マインドマップ

データベースのところで学習した【Neo4j】とも同じような感じですね。

ということで、まずはnetworkxをインストールします。

networkxのインストール

networkxのインストールは公式サイトで詳しく解説していますが、pipを使ってインストールします。

Anacondaを使ってPythonをインストールしている場合は、すでにインストールされているようです。

Pythonでnetworkxを使ってグラフを書く

matplotlibのインストール

もう一つ、グラフを描写するサードパーティーライブラリのmatplotlibもインストールします。

こちらもAnacondaを使っている場合は、すでにインストールされているかもしれませんが、インストールするコマンドはpip install matplotlibです。

1つの点を描写

準備が整えば、グラフを描写していきます。

まずはじめは、1つの点を表示してみます。

import matplotlib.pyplot as plt
import networkx as nx


G = nx.Graph()
G.add_node(1)

nx.draw(G)
plt.show()

最初にmatplotlibnetworkxをインポートします。

4行目、5行目でGraphオブジェクトGを作って、node(1)を加えた後、7行目、8行目でGを書き込み、matplotlibで表示しています。

これで1つの点が描画されるはずなのですが、何度やっても次のエラーが起こりました。

Intel MKL FATAL ERROR: Cannot load mkl_intel_thread.dll.

海外のサイトなどを調べつつmklパッケージをインストールすればいいのかと思ってインストールしても改善されず、networkxのバージョンを下げても改善されず、最終的に試したのが、一旦matplotlibnetworkxのアンインストールをしてから、再度インストールしたところ、ようやく次のグラフがポップアップで表示されました。

Pythonでnetworkxを使ってグラフを書く

エラーの原因を調べているうちに、Anacondaを再インストールしないと治らないなんて記事もあり、「まじかよ〜!」なんて思いながら「とりあえず、関係するライブラリ削除してから入れてみよっかな。」と考えて試してみたところうまくできて一安心。

ここまで学習してきてのAnaconda再インストールだけは避けたかったので、とりあえずなんとかなってよかったです。

ほんとうまくいかないときの解決方法を探すのって時間はかかるし、イライラするしで健康には良くありませんが、これもスキルアップするための1つだと考えると心を落ち着けることができました。

点を繋げる

続いていくつか点を書いて、線でつなげてみます。

import matplotlib.pyplot as plt
import networkx as nx


G = nx.Graph()
G.add_node(1)

G.add_nodes_from([2, 3])

G.add_edge(1, 2)
G.add_edge(2, 3)
G.add_edge(3, 1)

nx.draw(G)
plt.show()

8行目でnodeを2つ付け加えて、10行目から12行目でそれぞれの点を線でつなげています。

このファイルを実行すると、別ウインドウで次のグラフが描画されます。

Pythonでnetworkxを使ってグラフを書く

ちなみに別ウインドウで表示されるか、コンソール内に表示されるかは、Pycharmのバージョンによって異なるようです。

サンプルで楽しむ

networkxのサイトには、いろいろなグラフを表示するためのサンプルが用意されています。

Python networkx グラフを描写

今回はこの中の1つ【Random Geometric Graph】のコードをコピーペーストして活用してみました。

Pythonでnetworkxを使ってグラフを書く

他にもいろいろなサンプルが用意されているので、コードをコピーペーストしてグラフを表示して楽しんでください。

楽しむのが一番

学習というと、どうしても辛いとかおもしろくないという気持ちが一番に来てしまいがちですが、本来、学ぶというのは、知らないことを知ることなので、楽しいのが当たり前だと思います。

ただ、日本人はわけがわからないまま、正解を求められる学校教育を受けてしまうので、自分の興味関心はどこかに置き去りにされてしまいます。

学校の勉強が楽しくて仕方がないという子供はあまりいないと思いますが、自分が興味を持っていることについては、目を輝かして知りたいと思うからテレビに出るような天才と言われる子供が出てくるわけです。

Python学習に限らず、無理をして学習していてもなかなかスキルは身につかないので、興味を惹かれるものがあれば、それに没頭してみるのもいいかもしれませんよ。

私の場合は、Python学習に没頭しているのかどうかはちょっと疑問に感じるところがないわけではありませんが、ひととおり学習を終えたら、Webに特化してPythonのスキルを伸ばしていきたいと思っています。

それでは、明日もGood Python!