nx.Graph TypeError の描画時にエラーが報告される: '_AxesStack' オブジェクトは呼び出し可能ではありません
上に書く
ナレッジグラフの簡易可視化機能を実現。
NetworkX ライブラリはナレッジ マップの構築に使用され、matplotlib ライブラリはグラフィックの描画に使用されます。
数日以内に #总是noe4j智能知识图# に関する記事を公開する予定ですが、
詳細はまだ最適化中です
余談ですが、ナレッジ グラフの構築は、特にエンティティ間の関係を自動的に構築する場合に非常に時間がかかります。コードの実行には長い時間がかかり、論文では革新的なポイントとはみなされていません。少し味気ない感じです
。
ナレッジマップの視覚化
ナレッジマップの視覚化は、ナレッジマップのデータをグラフィカルに表示して、ナレッジマップ内の関係と情報をより直感的に理解、分析、探索することです。
インタラクティブなグラフィカル インターフェイスを介して、ナレッジ グラフ内の関係と概念を調査および分析でき、マクロからミクロまで自由に移動および参照できます。
検索エンジン、推奨システム、医学研究、ビジネスインテリジェンス、ソーシャルネットワーク、財務分析などの分野に応用できます。
期待される
nx.Graph()のグラフを描画します
エラーを報告する
TypeError: '_AxesStack' オブジェクトは呼び出し可能ではありません
nx.draw(graph, pos, with_labels=True, node_size=3000, font_size=12, node_color='skyblue', font_weight='bold', alpha=0.8, linewidths=0, edge_color='gray')
9 plt.title("Knowledge Graph")
10 plt.show()
File D:\Program\Anaconda\lib\site-packages\networkx\drawing\nx_pylab.py:113, in draw(G, pos, ax, **kwds)
111 cf.set_facecolor("w")
112 if ax is None:
--> 113 if cf._axstack() is None:
114 ax = cf.add_axes((0, 0, 1, 1))
115 else:
TypeError: '_AxesStack' object is not callable
<Figure size 1000x800 with 0 Axes>
考えられる理由
このエラーは、グラフの描画中に呼び出し不可能なオブジェクトを呼び出したために発生します_AxesStack
。通常、これは変数または関数名の競合に関連しています。コード内の別の場所でこのエラーの原因となっている名前または使用されている変数plt
または関数がないかどうかを確認してください。ax
問題を引き起こす可能性のある一般的な原因と解決策をいくつか示します。
-
plt
それが Matplotlib pyplot オブジェクトであり、他の場所で再定義されていないことを確認してください。を使用するplt
前に、コードの先頭に追加してみてくださいimport matplotlib.pyplot as plt
。 -
変数名が
ax
Axes オブジェクトとして割り当てられていないことを確認してください。Axes オブジェクトは、plt.subplots()
や などplt.add_axes()
の関数によって返されるためax
、通常の変数として使用すると競合が発生する可能性があります。 -
コードの他の部分が Matplotlib のデフォルトの動作を変更し、呼び出し不可能になっている可能性があります
AxesStack
。グラフをプロットする前に、Matplotlib に関連するカスタマイズや変更がないか確認してください。
上記の問題を確認した後、コードを変更して、描画部分が前述の問題と競合しないようにして、このエラーの発生を回避できます。
オリジナルコード
グラフ オブジェクトを引数として受け取り、グラフをプロットに表示する、draw_graph という関数を定義します。main 関数は空のグラフ オブジェクトを作成し、いくつかのノードとエッジを追加します。
import networkx as nx
import matplotlib.pyplot as plt
def draw_graph(graph):
pos = nx.spring_layout(graph, seed=42)
# 下面这行代码有问题,已修改为
# fig, ax = plt.subplots(figsize=(10, 8))
plt.figure(figsize=(10, 8))
nx.draw(graph, pos, with_labels=True, node_size=3000, font_size=12, node_color='skyblue', font_weight='bold', alpha=0.8, linewidths=0, edge_color='gray')
plt.title("Knowledge Graph")
plt.show()
def main():
# 假设已构建好知识图谱
graph = nx.Graph()
graph.add_nodes_from(["Entity1", "Entity2", "Entity3"])
graph.add_edges_from([("Entity1", "Entity2"), ("Entity2", "Entity3")])
draw_graph(graph)
if __name__ == "__main__":
main()
原因の確認
私が遭遇したのは 2 番目の理由です。Matplotlib の Axes オブジェクト (ax) との競合のためです。
これを回避するには、グラフを描画するときに Axes オブジェクトを明示的に指定してみてください。plt.subplots() で新しい Axes オブジェクトを作成し、それを nx.draw() 関数に渡します。
解決されたコード
import networkx as nx
import matplotlib.pyplot as plt
def draw_graph(graph):
pos = nx.spring_layout(graph, seed=42) # You can use different layout algorithms
fig, ax = plt.subplots(figsize=(10, 8))
nx.draw(graph, pos, with_labels=True, node_size=3000, font_size=12, node_color='skyblue', font_weight='bold', alpha=0.8, linewidths=0, edge_color='gray', ax=ax)
ax.set_title("Knowledge Graph")
plt.show()
def main():
# 假设已构建好知识图谱
graph = nx.Graph()
graph.add_nodes_from(["Entity1", "Entity2", "Entity3"])
graph.add_edges_from([("Entity1", "Entity2"), ("Entity2", "Entity3")])
draw_graph(graph)
if __name__ == "__main__":
main()