networkxとmatplotlib間の相互作用

Source python graph matplotlib networkx

私はmatplotlibでnetworkxと視覚化を試していますが、それらがどのように相互作用するのか明確に理解していないため、混乱していますか?
簡単な例があります
import matplotlib.pyplot
import networkx as nx
G=nx.path_graph(8)
nx.draw(G)
matplotlib.pyplot.show()

グラフGを描きたいことをpyplotにどこに伝えればよいですか?
nx.drawはmatplotlib.pyplot。{plotなど...}のようなものを使用していると思います
したがって、2つのグラフを描画する場合:
import matplotlib.pyplot
import networkx as nx

G=nx.path_graph(8)
E=nx.path_graph(30)
nx.draw(G)

matplotlib.pyplot.figure()
nx.draw(E)
matplotlib.pyplot.show()

それなら...ちょっとした実験
import networkx as nx
G=nx.path_graph(8)
E=nx.path_graph(30)
nx.draw(G)
import matplotlib.pyplot
matplotlib.pyplot.figure()
nx.draw(E)
import matplotlib.pyplot as plt
plt.show()

このばかげたコードについて私を殺さないでください、私はただ理解しようとしています-それがまだインポートされていないのに、networkxはどのようにmatplotlibを描画するのですか?

追伸:英語でごめんなさい。
推奨答え
グラフを別々に描画する場合、または単一のAxesオブジェクトを作成して、それをnx.drawに渡す場合は、2つの異なる軸を作成するだけです。例えば:
G = nx.path_graph(8)
E = nx.path_graph(30)

# one plot, both graphs
fig, ax = subplots()
nx.draw(G, ax=ax)
nx.draw(E, ax=ax)

取得するため:

2つの異なるFigureオブジェクトが必要な場合は、次のように別々に作成します。
G = nx.path_graph(8)
E = nx.path_graph(30)

# two separate graphs
fig1 = figure()
ax1 = fig1.add_subplot(111)
nx.draw(G, ax=ax1)

fig2 = figure()
ax2 = fig2.add_subplot(111)
nx.draw(G, ax=ax2)

降伏:


最後に、必要に応じて、次のようにサブプロットを作成できます。
G = nx.path_graph(8)
E = nx.path_graph(30)

pos=nx.spring_layout(E,iterations=100)

subplot(121)
nx.draw(E, pos)

subplot(122)
nx.draw(G, pos)

その結果:
axにはnx.drawへの呼び出しがいくつかあり、それがmatplotlibインターフェースに依存するため、pylabへのnx.draw引数は、gcaの外部でサブプロットを作成する場合はpylabのAPIでは役に立たないように見えます。それがなぜであるかを実際には掘り下げませんでした、ただ私がそれを指摘すると思っただけです。
nx.drawのソースコードはかなり単純です。
try:
    import matplotlib.pylab as pylab
except ImportError:
    raise ImportError("Matplotlib required for draw()")
except RuntimeError:
    print("Matplotlib unable to open display")
    raise

cf=pylab.gcf()
cf.set_facecolor('w')
if ax is None:
    if cf._axstack() is None:
        ax=cf.add_axes((0,0,1,1))
    else:
        ax=cf.gca()

# allow callers to override the hold state by passing hold=True|False

b = pylab.ishold()
h = kwds.pop('hold', None)
if h is not None:
    pylab.hold(h)
try:
    draw_networkx(G,pos=pos,ax=ax,**kwds)
    ax.set_axis_off()
    pylab.draw_if_interactive()
except:
    pylab.hold(b)
    raise
pylab.hold(b)
return
  • 図はgcfを使用して環境からキャプチャされます。
  • 次に、Axesオブジェクトが存在しない場合はフィギュアに追加されます。存在しない場合は、gcaを使用して環境から取得します。
  • プロットの面の色を白にします
  • holdをオンにします
  • は内部関数
  • で描画します
  • 軸をオフにします
  • 最後に、インタラクティブモードの場合は、
  • を描画し、キャッチされた例外を再発生させます
  • 関連記事

    フォーマット文字列で引数を中央揃えにする方法
    FSharpListをC#でリストに戻す方法は?
    Pythonの「RCut」関数
    Matplotlibでテキストをアニメーション化する方法は?
    VimはPythonで視覚的な選択範囲の間の文字列を取得します