2016-01-25 2 views
1

Это легко маркировать узлы графа, используя NetworkXЭтикетировочные узлы в NetworkX графа, когда узлы являются объектами

import networkx as nx 
import matplotlib.pyplot as plt 

G1 = nx.Graph() 
a = "A" 
b = "B" 
G1.add_nodes_from([a, b]) 
G1.add_edge(a, b) 
nx.draw_networkx(G1) # default with_labels=True 
plt.show() 

graph plot

Если узлы являются объектами, а не строки, я понимаю, что it's possible к создать дополнительный словарь и использовать его для ярлыков узлов, но можно ли использовать элемент объекта (name) непосредственно в качестве метки?

class Breakfast: 
    def __init__(self, name): 
     self.name = name 

spam = Breakfast("Spam") 
eggs = Breakfast("Eggs") 
G2 = nx.Graph() 
G2.add_nodes_from([spam, eggs]) 
G2.add_edge(spam, eggs) 
nx.draw_networkx(G2, with_labels=True) 
plt.show() 
+0

Что случилось с G2.add_nodes_from ([spam.name, eggs.name]) G2.add_edge (spam.name, eggs.name)? – MathBio

+0

@MathBio Проблема состоит в том, что узлы представляют собой строки, а не объекты «Завтрак», и доступ к другим атрибутам объекта-узла потребует установки дополнительного словаря (и ограничивает имена уникальными). – Calaf

ответ

0

Добавление простой repr метод, кажется, сделать трюк:

class Breakfast: 
    def __init__(self, name): 
     self.name = name 

    def __repr__(self): 
     return self.name 

spam = Breakfast("Spam") 
eggs = Breakfast("Eggs") 
G2 = nx.Graph() 
G2.add_nodes_from([spam, eggs]) 
G2.add_edge(spam, eggs) 
nx.draw_networkx(G2, with_labels=True) 
plt.show() 

nodes as objects

+0

Это делает это, но неутешительно, что ни один из параметров node_shape в matplotlib ('so ^> v Calaf

+0

@Calaf Возможно, попробуйте увеличить размер узла. Я предлагаю 'graph-tool', который использует cairo для рисования. Но я не понимаю, почему мой ответ не отвечает на ваш вопрос? – Kikohs

+0

Он делает. Я надеялся, что вы также знаете решение проблемы node_shape. :) – Calaf

Смежные вопросы