【问题标题】:Python / networkx: creation of note attributes fails erraticallyPython / networkx:创建笔记属性异常失败
【发布时间】:2015-10-09 22:26:07
【问题描述】:

我看到了一种让我发疯但我不理解的效果: 我正在从 6 列 SQL Server 2012 数据库表(nodeID、string(Class)、float(xCoordinate)、float(ycoordinate)、stringZone、char(Reference))中获取数据,我想使用这些实体创建网络图networkx Python 包。对我来说重要的是,我确实有几个具有预定义坐标的网络节点,我想稍后保持固定,其余部分将使用 Gephi 进行布局。

这是我的代码:

import pyodbc
import networkx as nx

dbConnection = pyodbc.connect('DB-Connection String')
dbCursor = dbConnection.cursor()

theGraph = nx.Graph()
theGraph.position={}
theGraph.deviceClass={}

queryStatement = "SELECT ComponentID, DeviceClass, CoordX, CoordY, AcceleratorZone, Reference FROM dbo.vComponentsWithZones WHERE Reference IN ('M','T')"
for dbRow in dbCursor.execute(queryStatement):
    nodeID = dbRow[0]
    theGraph.add_node(nodeID)

    deviceClass = dbRow[1]
    coordX = (dbRow[2] - 367421.373) / 100
    coordY = (dbRow[3] - 230238.784) / 100
    accelZone = dbRow[4]

    if coordX != None and coordY != None:
        print nodeID, coordX, coordY   <-------------------------
        theGraph.node[nodeID]["viz"] = {'position': {'x': coordX, 'y': coordY, 'z': 0}}

    if accelZone != None:
        theGraph.node[nodeID]["AccelZone"] = accelZone
    if dbRow[1] != None:
        theGraph.node[nodeID]["DeviceClass"] = deviceClass 

    if deviceClass == "Controls":
        theGraph.node[nodeID]["viz"] = {'color': {'r': "255", 'g': "0", 'b': "0", 'a': "1"}}
    elif deviceClass == "Magnet":
        theGraph.node[nodeID]["viz"] = {'color': {'r': "255", 'g': "200", 'b': "0", 'a': "1"}}
    elif deviceClass == "Vacuum":
        theGraph.node[nodeID]["viz"] = {'color': {'r': "0", 'g': "0", 'b': "255", 'a': "1"}}

queryStatement = "SELECT * FROM dbo.ComponentConnections"
for dbRow in dbCursor.execute(queryStatement):
    theGraph.add_edge(dbRow[0],dbRow[1], connectionTyp=dbRow[2])

dbConnection.close()

nx.write_gexf(theGraph,"cryringTopology.gexf")

一切似乎都运行良好,查看 print 语句的输出,一切似乎也运行良好;我确实得到了 nodeID、coordX、coordY 的值,只要数据库中有一个条目,程序就会评估语句

if coordX != None and coordY != None:

true 并正确执行其中的代码。

Screenshot of print output

但是,GEXF 文件的输出仅生成正确分配坐标的 6 个条目,其中应该是 40 - 50。似乎在某些情况下创建“位置”节点属性会失败,我完全迷路了。

有什么想法吗???

【问题讨论】:

  • theGraph.node[nodeID]["viz"] = {'color': {'r': "255", 'g': "0", 'b': "0", 'a': "1"}} 更改为theGraph.node[nodeID]["viz"]['color']= {'r': "255", 'g': "0", 'b': "0", 'a': "1"}(其他“颜色”行类似)。 Stefan 的回答解释了为什么这个改变会解决它。

标签: python graphviz networkx


【解决方案1】:

你在这一行中存储的内容

theGraph.node[nodeID]["viz"] = {'position': {'x': coordX, 'y': coordY, 'z': 0}}

被这些行覆盖

theGraph.node[nodeID]["viz"] = {'color': {'r': "255", 'g': "0", 'b': "0", 'a': "1"}}

【讨论】:

  • 这是真的,但无助于解决问题。我建议不要做第二个作业,而是更新字典。
  • 除了 bourbaki 所说的 - 另一种选择是使用 ["viz"] 以外的其他颜色作为颜色。
  • 感谢 Stefan,您的回答帮助我意识到我覆盖了我的属性。 @bourbaki4481472:你能这么好心并给出一个如何更新字典的明确例子吗?
  • @WolfiG 直接查看我对您问题的评论。
  • @WolfiG 示例:d = {'some_key' : 'some_value'}h = {'other_key' : 'other_value'}。为了合并两个字典,请执行d.update(h)
猜你喜欢
  • 2017-06-13
  • 2017-05-22
  • 2021-08-03
  • 2019-04-26
  • 1970-01-01
  • 2022-06-14
  • 1970-01-01
  • 1970-01-01
  • 2021-11-11
相关资源
最近更新 更多