-------- 公司交易.csv --------
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 实现到图形场景中的类的很好的例子 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
我做了一个实验,用 n 替换 i 并添加节点似乎有效,但随后我在添加边缘时遇到了问题。
for e in G.edges():
node1 = self.nodes[e[0]]
node2 = self.nodes[e[1]]
self.addEdge(node1, node2)
它一直说 e[0] 超出了范围。考虑到 Nodes.py 功能是将self.nodes转换为Nodes.nodes对象列表,我认为这可能是每个对象中的占位符,但我不太确定。然后,我尝试进行此更改:
node1 = e[0]
node2 = e[1]
但后来我在 Edge.py 中得到错误,指出
x1 = node1.centerX()
整数没有函数 centerX()
我有点不知所措。有人可以帮助我理解这一点并帮助我让它工作吗?
一个更小的问题可能有助于获得答案。 (例如,您x.py
中的任何内容似乎都与最后的问题相关)
为了帮助您入门,您可能会遇到一些命名空间重载(重命名相同的对象)。 在netxgui.py
中,您有import networkx as nx
但是几行之后,您声明了一个类nx(QtGui.QDialog)
。 在此之后,您尝试调用您可能希望来自networkx
而不是自定义 nx 类的nx.spring_layout()
。 您尝试访问的结构可能存在于 networkx 图形实例中,但不存在于 QDialog 实例中?
通常,避免使用from examplemodule import *
将使您在尝试跟踪错误或仅在开发代码时更轻松。
---编辑---
我仔细观察,问题是因为networkx.Graph
/中使用的不同表示。二合图等和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
实现。