23.2 Matriz con pandas y etiquetas (grafo dirigido o no dirigido)
import pandas as pd
import networkx as nx
import matplotlib.pyplot as plt
# Nombres de nodos
nodos = ["A", "B", "C", "D"]
# Matriz de adyacencia no simétrica, es decir, puede ser dirigido.
M = pd.DataFrame([[0, 2, 0, 1],
[0, 0, 3, 0],
[1, 0, 0, 0],
[0, 0, 4, 0]],
index=nodos, columns=nodos)
# Opción A: grafo no dirigido (ignora la orientación, combina pesos)
G_und = nx.from_pandas_adjacency(M) # Graph()
# Opción B: grafo dirigido
G_dir = nx.from_pandas_adjacency(M, create_using=nx.DiGraph)
pos = nx.random_layout(G_dir)
plt.figure(figsize=(6, 4))
nx.draw_networkx_nodes(G_dir, pos, node_size=800, node_color='white',
edgecolors='black')
nx.draw_networkx_labels(G_dir, pos, font_size=10)
# Anchos por peso y flechas
weights = [G_dir[u][v]['weight'] for u, v in G_dir.edges()]
nx.draw_networkx_edges(G_dir, pos, width=[0.8*w for w in weights], arrows=True, arrowstyle='-|>', arrowsize=15)
edge_labels = {(u, v): f"{d['weight']:.0f}" for u, v, d in G_dir.edges(data=True)}
nx.draw_networkx_edge_labels(G_dir, pos, edge_labels=edge_labels, font_size=8)
plt.axis('off')
plt.title("Grafo dirigido desde DataFrame (pandas)")
plt.show()
Notas rápidas:
- En grafos no dirigidos, las matrices son simétricas (\(A = A^t\)).
- Para grafos dirigidos, se usa
create_using=nx.DiGraph. - Los pesos suelen representarse con el valor de la celda; si la matriz es binaria (0/1), basta con usar
0/1y omitir el escalado de ancho. - El layout (
spring,kamada_kawai,circular,spectral, etc.) puede cambiarse según tu preferencia.