Saltar al contenido

Elimine el efecto de rotación al dibujar una cuadrícula cuadrada de nodos MxM en networkx usando grid_2d_graph

Solución:

Por defecto, networkx.draw utiliza un diseño de primavera. En su lugar, puede proporcionar sus propias posiciones con el parámetro pos. Esto es realmente muy simple, ya que las etiquetas de los nodos dadas networkx.grid_2d_graph en realidad son una tupla (fila, columna):

>>> G=nx.grid_2d_graph(2,2)
[(0, 1), (1, 0), (0, 0), (1, 1)]

Por lo tanto, puede usar el nombre de un nodo como su posición. Por lo tanto, solo necesita crear un diccionario que mapee los nodos a sí mismos y pasarlo como la posición.

pos = dict( (n, n) for n in G.nodes() )

Sin embargo, dado que también desea agregar etiquetas de nodo, debe usar networkx.draw_networkx, que toma un diccionario de etiquetas personalizadas como parámetro opcional. Necesitará un diccionario que asigne nodos a sus nuevas etiquetas. Dado que NetworkX le da a cada nodo la etiqueta (fila, columna) por defecto, podemos simplemente etiquetar cada nodo con fila * 10 + columna:

labels = dict( ((i, j), i * 10 + j) for i, j in G.nodes() )

Poniéndolo todo junto, obtienes el siguiente código que produce el siguiente gráfico:

import networkx as nx
import matplotlib.pyplot as plt

N = 10
G=nx.grid_2d_graph(N,N)
pos = dict( (n, n) for n in G.nodes() )
labels = dict( ((i, j), i * 10 + j) for i, j in G.nodes() )
nx.draw_networkx(G, pos=pos, labels=labels)

plt.axis('off')
plt.show()

trama

EDITAR

Usando la sugerencia de @AbdallahSobehy, podemos etiquetar los nodos de izquierda a derecha y de arriba a abajo.

labels = dict( ((i, j), i + (N-1-j) * 10 ) for i, j in G.nodes() )

parcela mejor etiquetada

Aclaraciones para apoyar la respuesta de @mdml (Todo lo que se dice aquí debe referirse a la respuesta de @mdml)

1- Claves de nodo usando nx.grid_2d_graph

Las claves dadas a los nodos se hacen implícitamente dando a cada nodo una clave de (i, j) que describe la fila y la columna. Para acceder a un nodo en (0,0) -> G[(0,0)]

2- Etiquetas utilizadas para dibujar

Las etiquetas especificadas para el dibujo deben hacerse de la siguiente manera para cumplir con el esquema de numeración de la pregunta:

labels = dict( ((i, j), i + (N-1-j) * N ) for i, j in G.nodes() ) 

tenga en cuenta que debe ser N y no 10, por lo que es más general, ya que si cambiara N, las etiquetas no serían las que esperaba. Además, estas etiquetas son solo para dibujar, por lo que no tienen nada que ver con el acceso al nodo.

3- Vincular claves a etiquetas

nodo de acceso -> G[(0,0)] se refiere al nodo 90 en el gráfico dibujado (esquina inferior izquierda en general), G[(1,0)] es el nodo de la derecha (91), mientras que G[(0,1)] es el nodo etiquetado (80), así que tenga cuidado con esta convención porque puede que no sea obvio.

4- Para dar un ID de nodos que sea equivalente a los del gráfico.

Puede usar el diccionario de etiquetas para agregar un atributo llamado id a cada nodo que contiene el número entero que ve en la figura dibujada:

for (i,j) in labels:
    G.node[(i,j)]['id'] = labels[(i,j)]

Creé un gráfico simple con N = 2 y usé las líneas en los puntos 2 y 3 e imprimí las identificaciones de la siguiente manera:

for i in xrange(N):
    for j in xrange(N):
        print 'Node ID at: (%d, %d) = %d'  %(i,j,G.node[(i,j)]['id'])
plt.axis('off')
plt.show()

Resultado:

Node ID at: (0, 0) = 2
Node ID at: (0, 1) = 0
Node ID at: (1, 0) = 3
Node ID at: (1, 1) = 1

ingrese la descripción de la imagen aquí

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *