2017-02-18 18 views
0

-------- companytrades.csv --------Пытаясь реализовать NetworkX в graphicsscene

date,Company1,Company2 
1/2/2017,1001,1111 
1/3/2017,1001,1100 
1/4/2017,1111,1001 
1/5/2017,1100,1001 
1/6/2017,1011,1001 
1/7/2017,1001,1111 
1/8/2017,1111,1100 
1/9/2017,1100,1011 

Я нашел интересный пример набора классов, реализующих NetworkX в graphicsscene GraphNetworkX.py

Node.py

Edge.py

Я использую следующий код для реализации этих трех модулей

--------- netxgui.py --------

import pandas as pd 
from numpy import * 
import sys 
from math import * 
from PyQt4 import QtCore,QtGui 
from PyQt4.QtCore import * 
from PyQt4.QtGui import * 
import networkx as nx 
import GraphNetworkX 
from x import * 

pf = pd.read_csv('/desktop/companytrades.csv',header=0,index_col=['date']) 

#setup the needed variables 
if __names__ == "__main__": 
    app = QtGui.QApplication(sys.argv) 
    app.setStyle("Plastique") 

class netx(QtGui.QDialog): 
    def __init__(self): 
     super(netx,self).__init__() 
     self.uiNX = Ui_Form() 
     self.uiNX.setupUi(self) 
     G = nx.from_pandas_dataframe(pf,'Company1','Company2',create_using=nx.DiGraph()) 
Pos = nx.spring_layout(g,scale=300) 
scene = GraphNetworkx.GraphGraphicsScene(G=g,pos=Pos) 
self.uiNX.neworkx_graphicsView.setScene(scene) 

NX = netx() 
NX.show() 
sys.exit(exit(app.exec_()) 
app.deleteLater() 

------- x.py -------

from PyQt4 import QtCore,QtGui 
try: 
    _fromUtf8 = QtCore.QString.fromUtf8 
except AttributeError: 
    def _fromUtf8(s): 
     return s 

try: 
    _encoding = QtGui.QApplication.unicodeUTF8 
    def _translate(context, text, disambig): 
     return QtGui.QApplication.translate(context, text, disambig, _encoding) 
except AttributeError: 
    def _translate(context, text, disambig): 
     return QtGui.QApplication.translate(context, text, disambig) 

class Ui_Form(object): 
    def setupUi(self, Form): 
     Form.setObjectName(_fromUtf8("Form")) 
     Form.resize(1492,1029) 
     self.networkx_graphicsView = QtGui.QGraphicsView(Form) 
     self.networkx_graphicsView.setGeometry(QtCore.QRect(240,70,971,911)) 
     sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding) 
     sizePolicy.setHorizontalStretch(0) 
     sizePolicy.setVerticalStretch(5) 
     sizePolicy.setHeightForWidth(self.networkx_graphicsView.sizePolicy().hasHeightForWidth()) 
     self.networkx_graphicsView.setSizePolicy(sizePolicy) 
     self.networkx_graphicsView.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) 
     self.networkx_graphicsView.setObjectName(_fromUtf8("networkx_graphicsView")) 
     self.retranslateUi(Form) 
     QtCore.QMetaObject.connectSlotsByName(Form) 
    def retranslateUi(self,Form): 
     Form.setWindowTitle(_translate("Form","Form",None)) 

У меня возникли проблемы с этим. Проблема, с которой я столкнулась, находится в GraphNetworkX под функцией drawGraph. Кажется, что функция печати работает правильно с n, но я действительно не понимаю аргументации для ее замены i.

i = 0 
    for n in G.nodes(): 
     #print str(pos[n][0]) + " " + str(pos[n][1])+ " "+str(n) 
     self.addNode(pos[i][0], pos[i][1], n) 
     i += 1 

Я выполнил эксперимент, заменив i на n, и добавление узлов, похоже, сработало, но затем у меня возникают проблемы с добавлением ребер.

for e in G.edges(): 
     node1 = self.nodes[e[0]] 
     node2 = self.nodes[e[1]] 
     self.addEdge(node1, node2) 

Он продолжает говорить, что е [0] из range..considering функции Nodes.py, чтобы превратить self.nodes в список объектов Nodes.nodes, я подумал, может быть, что это заполнитель внутри каждый из объектов, но я не совсем уверен. Затем я попытался сделать это изменение:

node1 = e[0] 
node2 = e[1] 

, но затем я получаю ошибку в Edge.py о том, что

x1 = node1.centerX() 

целое не имеет функцию CenterX()

Я немного в убыток. Может ли кто-нибудь помочь мне понять это и помочь мне заставить это работать?

ответ

1

Более минимальный вопрос может помочь с получением ответа. (например, ничто из вашего x.py не кажется актуальным для проблемы в конце)

Чтобы начать работу, вы, вероятно, страдаете от перегрузки одного пространства имен (переименование тех же объектов). В netxgui.py у вас есть import networkx as nx, но затем несколько строк позже вы объявляете класс nx(QtGui.QDialog). После этого вы пытаетесь позвонить nx.spring_layout(), который, предположительно, хотел быть от networkx, а не от вашего обычного класса nx. Возможно, что структуры, к которым вы пытаетесь получить доступ, существуют в экземплярах networkx Graph, но не в экземплярах QDialog?

В целом, избегая использования from examplemodule import *, вы сможете облегчить свою жизнь при попытке отслеживания ошибок или просто при разработке кода.

--- РЕДАКТИРОВАТЬ ---

Я смотрел ближе и проблема из-за различных представлений, используемых в networkx.Graph/.DiGraph и т.д., и в GraphGraphicsScene. Networkx использует словари внизу, для хранения узлов (а также краев). GraphGraphicsScene использует список узлов.

Быстрое и грязное решение: эти происходят, чтобы быть совместимыми, если ваши узлы помечены, начиная с 0, и имеют непрерывную последовательность.

Чуть более надежные будет генерировать свои собственные графики, как это, что может быть достигнуто следующим образом:

def re_index_digraph(G_orig): 
    remap = {i: n for (i,n) in enumerate(G_orig.nodes())} 
    inv_remap = {v:k for k,v in remap.items()} 
    G = nx.DiGraph() 
    G.add_nodes_from(remap) 
    remap_edges = [(inv_remap[src], inv_remap[sink]) for (src, sink) in G_orig.edges()] 
    G.add_edges_from(remap_edges) 
    return G 

G_orig = nx.from_pandas_dataframe(pf,'Company1','Company2',create_using=nx.DiGraph()) 
G = re_index_digraph(G_orig) 

, а затем продолжить с G, как вы были раньше. (если есть свойства, отличные от простого имени и ребер узла, вам необходимо соответствующим образом расширить функцию переназначения).

Кроме этого, возможно, потребуется внести значительные усилия в разработку реализации GraphGraphicsScene.

+0

Спасибо за совет. Я сделаю исправления и вернусь к результатам. Я сомневаюсь, что это полностью решит проблему. Я добавил x.py, потому что имею дело с PyQt4, и по опыту знаю, что с графическим интерфейсом меняется среда и поведение компонентов. – Daniel

+0

Ещё не работает .. пожалуйста, помогите. – Daniel

+0

что не работает? Я полагаю, что вы не используете точный код сверху (netxgui.py), так как он не работает как есть. Но если вы, по крайней мере, вам нужно будет сделать отступы определения класса – Bonlenfum