Экспорт графа networkx с объектами классов в качестве узлов в Gephi - PullRequest
0 голосов
/ 11 февраля 2019

Я работаю над примером графа Erdos Renyi с объектами классов, связанными с узлами Как использовать пользовательский объект класса в качестве узла networkx? в Networkx.Сначала создается пустой график.Затем я создаю 4 узла и сопоставляю данные (объект класса) с ним.Это позволяет мне иметь доступ к атрибутам объекта класса, выполнив это G.node [0] ['data']. X

, как объяснено в Как использовать пользовательский объект класса какузел networkx? .

Код объекта класса взят из: https://pythonprogramming.net/many-blob-objects-intermediate-python-tutorial/

Код выглядит так:

import pygame
import random
import networkx
from matplotlib import pyplot as plt
from scipy.stats import bernoulli

STARTING_BLUE_BLOBS = 10
STARTING_RED_BLOBS = 3

WIDTH = 800
HEIGHT = 600
WHITE = (255, 255, 255)
BLUE = (0, 0, 255)
RED = (255, 0, 0)

def Erdos_Renyi_gr(Bglob,p):
    Gcons = nx.Graph()
    #add nodes
    for i in range(4):
        Gcons.add_node(i, data = Bglob[i])

    for node1 in Gcons.nodes():
        for node2 in Gcons.nodes():
            if node1 < node2 and bernoulli.rvs(p=p):
                Gcons.add_edge(node1,node2)

    return Gcons

class Blob:

    def __init__(self, color):
        self.x = random.randrange(0, WIDTH)
        self.y = random.randrange(0, HEIGHT)
        self.size = random.randrange(4,8)
        self.color = color


def main():
   blue_blobs = dict(enumerate([Blob(BLUE) for i in 
    range(STARTING_BLUE_BLOBS)]))
    red_blobs = dict(enumerate([Blob(RED) for i in 
    range(STARTING_RED_BLOBS)])) 
    Gb = Erdos_Renyi_gr(blue_blobs,0.5)
    nx.write_gexf(Gb, 'quaker_network.gexf')

    nx.draw(Gb, with_labels=True)
    plt.draw()
    plt.show()
if __name__ == '__main__':
    main() `  

Проблема в том, чтони одна из команд «записи», которая хранит граф Networkx в формате, который будет открыт в Gephi, не работает для этого графа.Я предполагаю, что ошибка в основном связана с данными, связанными с моими узлами, поскольку ошибка говорит:

KeyError: <class '__main__.Blob'>

Полная трассировка стека ошибок выглядит примерно так:

runfile('G:/Bolbclassy.py')
Traceback (most recent call last):

  File "<ipython-input-2-03d6a2a74cde>", line 1, in <module>
  runfile('G:/Bolbclassy.py', )

  File "C:Anaconda3\lib\site-packages\spyder\utils\site\sitecustomize.py", 
 line 705, in runfile
    execfile(filename, namespace)

  File "C:Anaconda3\lib\site-packages\spyder\utils\site\sitecustomize.py", 
line 102, in execfile
    exec(compile(f.read(), filename, 'exec'), namespace)

  File "G:/Bolbclassy.py", line 55, in <module>
    main()

  File "G:/Bolbclassy.py", line 49, in main
    nx.write_gexf(Gb, 'quaker_network.gexf')

  File "<decorator-gen-571>", line 2, in write_gexf

  File "C:Anaconda3\lib\site-packages\networkx\utils\decorators.py", line 
227, in _open_file
    result = func_to_be_decorated(*new_args, **kwargs)

  File "C:Anaconda3\lib\site-packages\networkx\readwrite\gexf.py", line 88, 
in write_gexf
    writer.add_graph(G)

  File "C:Anaconda3\lib\site-packages\networkx\readwrite\gexf.py", line 305, 
in add_graph
self.add_nodes(G, graph_element)

  File "C:Anaconda3\lib\site-packages\networkx\readwrite\gexf.py", line 340, 
in add_nodes
    node_data, default)

  File "C:Anaconda3\lib\site-packages\networkx\readwrite\gexf.py", line 436, 
in add_attributes
    attr_id = self.get_attr_id(make_str(k), self.xml_type[val_type],

KeyError: <class '__main__.Blob'>

Любые идеи, какэто можно исправить?

Спасибо,

...