绘制的networkx图和数据框条目之间不匹配

时间:2018-06-26 19:14:32

标签: python pandas dataframe networkx mismatch

我正在尝试从包含我的节点和边缘数据的数据帧构建有向图。该图已绘制,但是当我尝试为边缘分配Alpha值或特定宽度时,我意识到数据帧中的数据与networkx绘制的内容之间存在不匹配(边缘接收错误的宽度)。

这是我的代码:

df = df.drop_duplicates()
df = df.reset_index(drop=True)

edge_list = df.loc[:, ['f', 't', 'v']]
edge_list.to_csv('edges.csv', index=False, header=False)

G = read_edgelist('edges.csv', delimiter=',', create_using=MultiDiGraph(), data=[('weight', float)],
                    edgetype=float)

pos = nx_pydot.pydot_layout(G, prog='dot')

plot.figure(figsize=(10, 10), dpi=150)

draw_networkx_nodes(G, pos, node_color='skyblue', node_size=5000, nodelist=nodes)
draw_networkx_nodes(G, pos, node_size=2000, node_color='r', nodelist=[address], node_shape='s', edgecolors='black')
draw_networkx_nodes(G, pos, node_size=2000, node_color='r', nodelist=taintsources, node_shape='s', edgecolors='black')
edges = draw_networkx_edges(G, pos, arrows=True, arrowsize=30, arrowstyle='->', edge_color='black')
draw_networkx_labels(G, pos, font_size=9)

# set alphas
i = 0
for a in df['v']:
    edges[i].set_alpha(a)
    i += 1

plot.show()

现在,数据帧中的数据(重新索引和删除后的df)如下:

                f                                           t          v                                                  l
0   0xdbd838...  0x3f5ce5fbfe3e9af3971dd833d26ba9b5c936f0be   4.999775  0xaeaac2670575ca1602b598401c43e85513edf7e99974...
1   0xe6c334...  0x3f5ce5fbfe3e9af3971dd833d26ba9b5c936f0be   1.507629  0xcad1b3c29d03dc55234334d906e61dde140b91985a13...
2   0xec7bcd...  0x3f5ce5fbfe3e9af3971dd833d26ba9b5c936f0be   1.428406  0x419685acc8b968b48536d190d2c50dffc7fda8fb8579...
3   0x1fe81d...  0x3f5ce5fbfe3e9af3971dd833d26ba9b5c936f0be   2.973072  0xac8d0f5c672b5e27dad3687606bc2aedffc3611fa2f8...
4   0xe6c334...  0x3f5ce5fbfe3e9af3971dd833d26ba9b5c936f0be   0.714586  0xaa27468c07ba13b185f83e71934ab0e0aa684570faf6...
5   0xdbd838...  0x3f5ce5fbfe3e9af3971dd833d26ba9b5c936f0be   0.714511  0x56a0783f46e8176df3b5833480e6565e3110e8ba952d...
6   0xa92189...                                 0xdbd838...   5.000000  0xda791bbba0fd49e733970ad9b48d6c1fff02d5e93b1b...
7   0x523564...                                 0xa92189...   5.000255  0x0c5e6548f5285520fc03a7ebf5f636e9475c1f678db8...
8   0x5abf99...                                 0x523564...  10.714286  0x24699357078cc1cfe6b3d57a67ffab18ef132dc86996...
9   0xc50be6...                                 0xe6c334...   1.507929  0xe6bf05d6c99db12d1735a62f2c3a9df37941025de2d6...
10  0x523564...                                 0xc50be6...   1.508184  0x62c7a7793294ac46094ceb0c580fcc8593575a8c6fbc...
11  0x329fda...                                 0x1fe81d...   2.977357  0x66bd13433f5ab207aced390ba2c915f913556105f010...
12  0x9dc588...                                 0x329fda...   2.977582  0x09714e7e2dedec960801b74d4838aac99ded96bbb29e...
13  0x523564...                                 0x9dc588...   2.977837  0xe83750f61b3bde48c39ce384d3b480e393e39c78d2fb...
14  0x68a419...                                 0xec7bcd...   1.428571  0xecba439590735ca8cdd69ba5669c8fdcbda68eefeee1...
15  0xfb08f9...                                 0x68a419...   1.428826  0x6c5d9dc5af2074b1ff81ef7f700df837693d6fba21b5...
16  0x523564...                                 0xfb08f9...   1.494462  0x5d404be34d7108a3b029340f39fe2e62e6983dba858f...

现在有两个问题: df包含17个条目,而图形仅包含15(?)边,因此权重未分配给正确的边。当涉及到箭头的宽度(错误的边缘处的最宽箭头)时,结果图形(plot.show())的分配显然有误。我猜想图中的某些边缘会合并,从而导致不匹配。我该如何预防?我该怎么做对? 我真的很感谢您的投入! :)

编辑1: 这是此代码中使用的我的数据(作为JSON字符串):

address = "0x3f5ce5fbfe3e9af3971dd833d26ba9b5c936f0be"
taintsources = ["0x5abf99..."]
nodes = ["0x9dc588...", "0xec7bcd...", "0xdbd838...", "0xc50be6...", "0xa92189...", "0x523564...", "0x1fe81d...", "0xe6c334...", "0x68a419...", "0xfb08f9...", "0x329fda..."]

df(删除并重置索引后):

https://pastebin.com/vc8L665V(字母缩放)

https://pastebin.com/JyDLwdNJ (宽度缩放)

Edit2 :代码调整可获取更多上下文。还调整了df值,因为v列现在在0.1和1.0之间缩放(以匹配alpha通道),而不是从1-10缩放(以前尝试为每个边缘设置不同的箭头宽度)。

Edit3:添加了图像: enter image description here 可以看到,0x5abf99 ...和0x523564 ...之间的边没有牢固的连接,但是根据数据框,它应该是。

1 个答案:

答案 0 :(得分:0)

因此,罪魁祸首是以下两行

4   0xe6c334...     0x3f5ce5fbfe3e9af3971dd833d26ba9b5c936f0be  0.714586    0xaa27468c07ba13b185f83e71934ab0e0aa684570faf6...
5   0xdbd838...     0x3f5ce5fbfe3e9af3971dd833d26ba9b5c936f0be  0.714511    0x56a0783f46e8176df3b5833480e6565e3110e8ba952d...

这些是重复的边,唯一的区别是列v上的值 因此,您需要创建一个multiDigraph()来说明具有不同属性的多个边。

此外,我不确定from_pandas_edgelist是否支持读取边缘属性,因此我通过使用read_edgelist对您的代码进行了以下更改,这说明了多个边缘

df = df.drop_duplicates()
df = df.reset_index(drop=True)

#Convert the data to node1, node2, attribute_data format
edge_list = df.loc[:,['f','t','v']]
edge_list.to_csv('edges.csv', index=False,header=False)

G = nx.read_edgelist('edges.csv',delimiter=',',create_using=nx.MultiDiGraph(),data=[('weight',float)],edgetype=float)

print len(G.edges())
#output : 17