何かを書き留める何か

数学や読んだ本について書く何かです。最近は社会人として生き残りの術を学ぶ日々です。

自分のためのnetworkXメモ

「ランダムグラフを生成し保存する、そしてある操作をして得られたグラフをまた保存をする」というのはグラフ理論をやる人ならばよくある光景ではないだろうか。そこで私は以下の様なPythonコードを書いた。

import networkx as nx
import matplotlib.pyplot as plt
import random

G = nx.fast_gnp_random_graph(20, 0.5)
nx.draw_circular(G)
plt.savefig("random.png")

# 頂点をランダムに10個選んで削除
G.remove_nodes_from(random.sample(G.nodes(),10))

nx.draw_circular(G)
plt.savefig("random-after.png")

だが、これを実行するとrandom-after.pngが操作前のグラフを含んだものになってしまう。どうすればよいのかと思いGoogle先生に尋ねたが答えは無かった。仕方がないのでmatplotlibのマニュアル(900ページ!)を調べてやっとわかった。

import networkx as nx
import matplotlib.pyplot as plt
import random

G = nx.fast_gnp_random_graph(20, 0.5)
nx.draw_circular(G)
plt.savefig("random.png")
plt.close() #一旦閉じる!!!

# 頂点をランダムに10個選んで削除
G.remove_nodes_from(random.sample(G.nodes(),10))

nx.draw_circular(G)
plt.savefig("random-trifree.png")

そう、plt.close()をする必要があったのだ。マニュアルをよく読みましょうという話でした。