Grafos con networkx Python II


networkx1

En la pasada entrada toque un poco el tema de grafos en python con NetworkX aunque a mi parecer NetworkX es solo una librería con la que podemos crear grafos como cualquier librería no tienen casi nada que ver con la programación pensada en Python mas bien me parece un poco similar a las pilas aunque NetworkX es un poco mas robusto, en esta entrada creare un grafo y cambiare el color y algunas cosas sencillas lo tratare como listas aunque mas tarde colocare como crear un archivo GML y trabajar sobre el lo que nos servirá mucho para aumentar la densidad de datos del grafo.

Por ahora vamos por partes como dijo Jack el destripador ;D

Bueno la mayor parte de la información la he sacado del siguiente sitio:

networkx.lanl.gov/index.html

Donde se redacta como se puede crear un grafo y como crear nodos y hojas, aquí vamos a crear un grafo mas o menos pequeño y vamos a cambiar el color a sus vértices, en la siguientes entradas manejaremos listas GML y allí vamos a ver como crear color por grupos de vértices y vamos a aplicar algoritmos a estos grafos y veremos para que nos sirve todo lo que vamos haciendo por ahora todo es un poco raro para la gente que no entiende de grafos.

Lo que voy a hacer es crear un grafos y voy comentando el código, sobre que haré el grafos lo haré de alguna de las conexiones de las principales carreteras de valencia y algunos sitios que nos interesa llegar(ojo todavía no entrare con el mapa es decir no sera útil solo como información), mas adelante colocaremos el grafo encima de un mapa preciso y veremos como nos ayuda a tomar algunas decisiones(algo asi como los mapas de tácticas militares :D)

importamos las librerías que vamos a usar:

import networkx as nx 
import matplotlib.pyplot as plt

Lo que hacemos es importar NetworkX como nx(esta es la librería de los grafos) y matplotlib.pyplot(esta es la librería para crear el gráfico)

Para mi no es necesario colocar #!/bin/python ya que networkx funciona con cualquier python que se alla montado bien hablo de la version 2.5 en adelante y de Debian claro, si estuviera programando en python 3 coloco de donde saco el $Path aquí no hace falta!!!!

.Creamos el grafo vació o ya lleno eso depende y a mi me parece igual asi que lo creo vació y luego lo lleno, lo importante es seguir el comando de NetworkX ojo esto en realidad no es Python!!!

G=nx.Graph()

no hay nada que decir solo que nx es NetworkX y que G=unGrafoVacio 😀

G.add_nodes_from(["CampCa","PlzTo","LaFlor","Mayor" ,"LaBr","PlzBol","AC","AvB","ClinVi","Une","UniCar","AgTEr","PtoCab", "StaRo", "CPol"])

Se que me faltan muchas 😀 esto es solo un ejemplo para que veamos los enlaces este grafo no es ponderado y las aristas no tendran nombre por ahora!!!

Si queremos agregar un solo nodo lo hacemos asi:

G.add_node("NodoNombre")

No importa que ya hayamos agregado los otros de arriba

Mas adelante veremos como agregar la famosa lista 😀

Ahora tenemos que agregar las conexiones me saltare algunas!!! tratare de colocar varias para hacer los ejercicios con los algoritmos que tengo en mente mas adelante!!!

G.add_edge("CampCa","PlzTo")

G.add_edge("PlzTo","Mayor")

G.add_edge("PlzTo","CPol")

G.add_edge("LaFlor","CPol")

G.add_edge("Mayor","LaFlor")

G.add_edge("LaFlor","StaRo")

G.add_edge("LaFlor","PlzBol")

G.add_edge("StaRo","LaBr")

G.add_edge("StaRo","AvB")

G.add_edge("StaRo","Une")

G.add_edge("StaRo","PlzBol")

G.add_edge("StaRo","UniCar")

G.add_edge("StaRo","LaBr")

G.add_edge("StaRo","AC")

G.add_edge("AC","AvB")

G.add_edge("AC","LaBr")

G.add_edge("AC","ClinVi")

G.add_edge("ClinVi","AvB")

G.add_edge("AvB", "UniCar")

G.add_edge("AvB","Une")

G.add_edge("AvB","AgTEr")

G.add_edge("AgTEr","PtoCab")

Así la cosa se hace un poco difícil aunque nada del otro mundo, podrían haber mas aristas o enlaces entre los vértices, ojo las avenidas no deberían ser vértices mas adelante lo corrijo :S

Ahora le damos algunas indicaciones a matploit para visualizar el grafo las indicaciones anteriores son perfectamente posibles aquí incluso podríamos usar las 2 indicaciones:

nx.draw_circular(G,node_size=3000,node_color='b')

Tamaño del nodo 3000 y color azul, a y quiero que sea circular

Ahora lo vemos en pantalla

plt.show()

<span style="font-family: Liberation Sans,sans-serif;"><span style="font-size: large;">nx.draw(G)</span></span>
<span style="font-family: Liberation Sans,sans-serif;"><span style="font-size: large;">plt.savefig("networkx1.png")


Si queremos guardar el dibujo lo hacemos como dice arriba, coloale cualquier nombre 😀

Ahora si queremos tener mas información del grafo como el numero de Vértices y enlaces o aristas lo hacemos así 😀

print "Nodos: ", G.number_of_nodes(), G.nodes()
print "Enlaces: ", G.number_of_edges(),G.edges()

Funciona perfectamente en mi Knoppix 7.X con python 2.7

Aquí el código completo funcionando

Inspirado en:

http://ernesto-ecrespo.blogspot.com/2012/11/creacion-de-grafos-con-networkx-parte-1.html

Es importante añadir que un solo espacio entre las comillas dara como resultado otro vertice no es lo mismo “LaFlor” que ” LaFlor”…..

Codigo

#!/usr/local/bin/python
#
# -*- coding: latin-1 -*-
import os, sys

#Grafo no ponderado

import networkx as nx
import matplotlib.pyplot as plt
G=nx.Graph()
G.add_nodes_from(["CampCa","PlzTo","LaFlor","Mayor" ,"LaBr","PlzBol","AC","AvB","ClinVi","Une","UniCar","AgTEr","PtoCab", "StaRo", "CPol"])

G.add_edge("CampCa","PlzTo")

G.add_edge("PlzTo","Mayor")

G.add_edge("PlzTo","CPol")

G.add_edge("LaFlor","CPol")

G.add_edge("Mayor","LaFlor")

G.add_edge("LaFlor","StaRo")

G.add_edge("LaFlor","PlzBol")

G.add_edge("StaRo","LaBr")

G.add_edge("StaRo","AvB")

G.add_edge("StaRo","Une")

G.add_edge("StaRo","PlzBol")

G.add_edge("StaRo","UniCar")

G.add_edge("StaRo","LaBr")

G.add_edge("StaRo","AC")

G.add_edge("AC","AvB")

G.add_edge("AC","LaBr")

G.add_edge("AC","ClinVi")

G.add_edge("ClinVi","AvB")

G.add_edge("AvB", "UniCar")

G.add_edge("AvB","Une")

G.add_edge("AvB","AgTEr")

G.add_edge("AgTEr","PtoCab")

nx.draw_circular(G,node_size=3000,node_color='b')
plt.show()

print "Nodos: ", G.number_of_nodes(), G.nodes()
print "Enlaces: ", G.number_of_edges(),G.edges()

nx.draw(G)
plt.savefig("networkx1.png")
Anuncios

10 pensamientos en “Grafos con networkx Python II

  1. Disculpa la tardanza debes tener instalado networkx y pyplot, y no necesitas compilar en python ya que es un lenguaje interpretado, solo escribes “python nombredelarchivo.py” y ya deberia estar corriendo en caso contrario te dara un error que podremos solucionar por aqui 😀

    Me gusta

    • No lo he probado con Guindows lo siento… no deberia haber problema con python yo uso 2.7 casi siempre que puedo…. Revisa la libreria que sean compatibles aunque no creo que eso ayude mucho de verdad nunca he usado python en Guindows Disculpa :S

      Me gusta

  2. Pingback: Python y Grafos en la Vida Real | La Shell del Bit Pegajoso

    • Numero de Nodos eso depende del problema, por ejemplo si tengo 5 centrales de lo que sea en Venezuela, España, EEUU, Japón y China, cada estación o país es el nodo y las conexiones es la interacción entre ellas… no entiendo mucho la pregunta en los ejemplos de la serie están especificados con distancias :D… Saludos

      Me gusta

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s