「ランダムグラフを生成し保存する、そしてある操作をして得られたグラフをまた保存をする」というのはグラフ理論をやる人ならばよくある光景ではないだろうか。そこで私は以下の様な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()をする必要があったのだ。マニュアルをよく読みましょうという話でした。