Se informa un error al dibujar nx.Graph TypeError: el objeto '_AxesStack' no se puede llamar
escribir en la parte superior
Realice una función de visualización simple del gráfico de conocimiento.
La biblioteca NetworkX se usa para construir un mapa de conocimiento y la biblioteca matplotlib se usa para dibujar gráficos.
En unos días, publicaré un artículo sobre #总是noe4j智能知识图#,
y los detalles aún se están optimizando.
Aparte, construir un gráfico de conocimiento es realmente lento, especialmente para construir automáticamente la relación entre entidades. El código tarda mucho en ejecutarse y
no se considera el punto de innovación en el documento. Se siente un poco de mal gusto.
Visualización de mapas de conocimiento
La visualización del mapa de conocimiento consiste en mostrar los datos del mapa de conocimiento de forma gráfica, para comprender, analizar y explorar la relación y la información en el mapa de conocimiento de manera más intuitiva.
A través de la interfaz gráfica interactiva, las relaciones y los conceptos en el gráfico de conocimiento se pueden explorar y analizar, y se pueden navegar y navegar libremente desde lo macro hasta lo micro.
Se puede aplicar a motores de búsqueda, sistemas de recomendación, investigación médica, inteligencia comercial, redes sociales, análisis financiero y otros campos.
esperado
Dibuja el gráfico de nx.Graph()
informar error
TypeError: el objeto '_AxesStack' no se puede llamar
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>
razón posible
Este error se debe a la llamada a un objeto no invocable mientras se dibuja el gráfico _AxesStack
, por lo general esto está relacionado con un conflicto con el nombre de una variable o función. plt
Verifique si hay una variable o función nombrada o utilizada en otra parte de su código ax
que esté causando este error.
Aquí hay algunas causas comunes y soluciones que pueden causar problemas:
-
Asegúrese
plt
de que sea un objeto pyplot de Matplotlib y que no se haya redefinido en ningún otro lugar.plt
Puede intentar agregar al principio de su código antes de usarimport matplotlib.pyplot as plt
. -
Asegúrese de que el nombre de la variable no esté
ax
asignado como un objeto Axes. El objeto Axes es devuelto por funciones comoplt.subplots()
o , por lo que si se usa como una variable ordinaria, puede causar conflictos.plt.add_axes()
ax
-
Podría ser que alguna otra parte del código haya modificado el comportamiento predeterminado de Matplotlib para que
AxesStack
no se pueda llamar. Verifique si hay personalizaciones o modificaciones relacionadas con Matplotlib antes de trazar el gráfico.
Después de confirmar los problemas anteriores, puede intentar modificar el código y asegurarse de que la parte del dibujo no entre en conflicto con los problemas mencionados anteriormente, para evitar que ocurra este error.
codigo original
Define una función llamada dibujar_gráfico que toma un objeto de gráfico como argumento y muestra el gráfico en un gráfico. La función principal crea un objeto de gráfico vacío y agrega algunos nodos y bordes.
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()
Causa Confirmación
Lo que encontré fue la segunda razón: debido a un conflicto con el objeto Axes de Matplotlib (ax).
Para evitar esto, intente especificar el objeto Axes explícitamente al dibujar el gráfico. Cree un nuevo objeto Axes en plt.subplots() y páselo a la función nx.draw().
código resuelto
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()