NetworkX - 连接的列

Posted

技术标签:

【中文标题】NetworkX - 连接的列【英文标题】:NetworkX - Connected Columns 【发布时间】:2018-09-11 21:33:01 【问题描述】:

我正在尝试创建数据可视化,也许 NetworkX 不是最好的工具,但我希望有相互连接的并行节点列(2 个单独的组)。我不知道如何在这个布局中放置两组节点。我尝试过的不同选项总是默认为更“类似网络”的布局。我正在尝试创建一个可视化,其中客户/公司(字典中的键)将边缘绘制到产品节点(同一字典中的值)。

例如:

d = "A":[ 1, 2, 3], "B": [2,3], "C": [1,3]

从字典 'd' 中,我们将有一列节点 ["A", "B", "C"] 和第二列 [1, 2, 3] 并在两条边之间绘制。

A                   1
B                   2
C                   3

更新:

所以建议的“pos”参数有所帮助,但我认为在多个对象上使用它会遇到困难。这是我想出的方法:

nodes = ["A", "B", "C", "D"]
nodes2 = ["X", "Y", "Z"]

edges = [("A","Y"),("C","X"), ("C","Z")]

#This function will take a list of values we want to turn into nodes
# Then it assigns a y-value for a specific value of X creating columns
def create_pos(column, node_list):
    pos = 
    y_val = 0
    for key in node_list:   
        pos[key] = (column, y_val)
        y_val = y_val+1
    return pos 



G.add_nodes_from(nodes)
G.add_nodes_from(nodes2)
G.add_edges_from(edges)

pos1 = create_pos(0, nodes)
pos2 = create_pos(1, nodes2)
pos = **pos1, **pos2

nx.draw(G, pos)

【问题讨论】:

您是否考虑过为此简单地使用 matplotlib 并在点之间手动创建线条?文本注释需要一些技巧,但我认为这更容易。 也许你也想考虑一下这个:***.com/a/11809184/6673446 检查draw_networkx的pos参数。它需要一个节点的字典:位置,一个位置是一个简单的坐标元组。 @wolfrevokcats,谢谢!我不得不解决它,但这使我走上了正确的轨道,我发现这是一个可行的解决方案(在更新中)。想法? @JamesGregorie,不,这样是错误的,你最好在函数中创建 pos 并返回:def create_pos(..): pos= ... return pos。然后:pos1 = create_pos(0, nodes); pos2 = create_pos(1, nodes1)。最后合并:pos = **pos1, **pos2 【参考方案1】:

这是我在@wolfevokcats 的帮助下编写的代码,用于创建连接的节点列。

G = nx.Graph()

nodes = ["A", "B", "C", "D"]
nodes2 = ["X", "Y", "Z"]

edges = [("A","Y"),("C","X"), ("C","Z")]

    #This function will take a list of values we want to turn into nodes
    # Then it assigns a y-value for a specific value of X creating columns
def create_pos(column, node_list):
    pos = 
    y_val = 0
    for key in node_list:   
        pos[key] = (column, y_val)
        y_val = y_val+1
    return pos 



G.add_nodes_from(nodes)
G.add_nodes_from(nodes2)
G.add_edges_from(edges)

pos1 = create_pos(0, nodes)
pos2 = create_pos(1, nodes2)
pos = **pos1, **pos2

nx.draw(G, pos, with_labels = True)

【讨论】:

以上是关于NetworkX - 连接的列的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 python 的 networkx 模块从节点列表生成完全连接的子图

在networkx中添加多个有向边

在networkx中模拟图模型

networkx 通过欧几里得距离阈值构造图

减少networkx中图的节点/边数

networkx图论Depth First Search深度优先搜索遍历DFS,基于递归,Python