简体   繁体   English

具有 csv 输入和 plotly output 的网络图

[英]networkx graph with csv input and plotly output

Some background...一些背景...

I am a beginner to python and networkx...我是 python 和 networkx 的初学者...

I have a csv file with multiple columns.我有一个包含多列的 csv 文件。

I have extracted the columns that contained the sender and receiver addresses and put them into lists like so:我提取了包含发送方和接收方地址的列,并将它们放入列表中,如下所示:

with open('file.csv,'r') as csv_file:
    lines = csv_file.readlines()

sip = []
dip = []

for line in lines:
    data = line.split(',')
    sip.append(data[9])
    dip.append(data[10])
nodes=list(set().union(sip,dip))
edges=list(set().union(list(zip(sip,dip))))

A quick print of my G.nodes() and G.edges() gives me the following output:我的 G.nodes() 和 G.edges() 的快速打印给了我以下 output:

edges = [('AddressA','AddressB'),('AddressA','AddressC')]
nodes = ['AddressA','AddressB','AddressC']

where edges = [('senderaddress','receiveraddress')]其中边 = [('senderaddress','receiveraddress')]

My goal我的目标

I wish to use networkx to plot out connections between senders and receivers.我希望使用 networkx 来 plot 输出发送者和接收者之间的连接。

I am using this page as reference.我使用这个页面作为参考。

This is my current code:这是我当前的代码:

import plotly.graph_objs as go
import networkx as nx
from plotly.subplots import make_subplots

#######CREATE NODES/EDGES#############
G=nx.Graph()
nodes=list(set().union(sip,dip))
edges=list(set().union(list(zip(sip,dip))))
G.add_nodes_from(nodes)
G.add_edges_from(edges)
pos = nx.get_node_attributes(G,'pos')

edge_trace = go.Scatter(
    x=[],
    y=[],
    line=dict(width=0.5,color='#888'),
    hoverinfo='none',
    mode='lines')

for edge in G.edges():
    x0, y0 = G.nodes[edge[0]]['pos']
    x1, y1 = G.nodes[edge[1]]['pos']
    edge_trace['x'] += tuple([x0, x1, None])
    edge_trace['y'] += tuple([y0, y1, None])

node_trace = go.Scatter(
    x=[],
    y=[],
    text=[],
    mode='markers',
    hoverinfo='text',
    marker=dict(
        showscale=True,
        colorscale='YlGnBu',
        reversescale=True,
        color=[],
        size=10,
        colorbar=dict(
            thickness=15,
            title='Node Connections',
            xanchor='left',
            titleside='right'
        ),
        line=dict(width=2)))

for node in G.nodes():
    x, y = G.nodes[node]['pos']
    node_trace['x'] += tuple([x])
    node_trace['y'] += tuple([y])

# ########COLOR NODES#########
for node, adjacencies in enumerate(G.adjacency()):
    node_trace['marker']['color']+=tuple([len(adjacencies[1])])
    node_info = '# of connections: '+str(len(adjacencies[1]))
    node_trace['text']+=tuple([node_info])

# ########CREATE GRAPH#########
fig = go.Figure(data=[edge_trace, node_trace],
             layout=go.Layout(
                title='<br>Network graph made with Python',
                titlefont=dict(size=16),
                showlegend=False,
                hovermode='closest',
                margin=dict(b=20,l=5,r=5,t=40),
                annotations=[ dict(
                    text="Python code: <a href='https://plot.ly/ipython-notebooks/network-graphs/'> https://plot.ly/ipython-notebooks/network-graphs/</a>",
                    showarrow=False,
                    xref="paper", yref="paper",
                    x=0.005, y=-0.002 ) ],
                xaxis=dict(showgrid=False, zeroline=False, showticklabels=False),
                yaxis=dict(showgrid=False, zeroline=False, showticklabels=False)))

fig.show()

However, I end up with this error:但是,我最终遇到了这个错误:

  x0, y0 = G.nodes[edge[0]]['pos']
KeyError: 'pos'

A print(pos) showed that it was empty: print(pos) 显示它是空的:

{}

I'm not sure where the error lies.我不确定错误在哪里。 I believe it may have started since I populated the graph with nodes and edges.我相信它可能已经开始,因为我用节点和边填充了图形。 I am not sure how to rectify it though...我不知道如何纠正它......

I modified some part of the posted code.我修改了部分发布的代码。 With nodes and edges given directly, from the output shown in question.直接给出节点和边,来自问题所示的 output。

import plotly.graph_objs as go
import networkx as nx
from plotly.subplots import make_subplots

x = []
y = []
G=nx.Graph()
 #from question edges = [('AddressA','AddressB'),('AddressA','AddressC')] nodes = ['AddressA','AddressB','AddressC']
print ("nodes =", nodes)
print ("edges =", edges)

G.add_nodes_from(nodes, word1 = 'word2')

pos = nx.get_node_attributes(G,'word1')
G.add_edges_from(edges)
print("pos = ", pos)

This will print pos这将打印 pos

Note1:注1:

If I G.add_edges_from before pos = nx.get_node_attributes(G,'word1');如果 I G.add_edges_from before pos = nx.get_node_attributes(G,'word1'); then pos = []然后 pos = []

If I assign pos = nx.get_node_attributes(G,'word1') before G.add_edges_from then pos will print correctly如果我在 G.add_edges_from 之前分配 pos = nx.get_node_attributes(G,'word1') 那么 pos 将正确打印

I get output as follows:我得到 output 如下:

nodes = ['AddressA', 'AddressB', 'AddressC']
edges = [('AddressA', 'AddressB'), ('AddressA', 'AddressC')]
pos =  {'AddressA': 'word2', 'AddressB': 'word2', 'AddressC': 'word2'}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM