def drew_graph(df_target_relation,df_target_label):
def add_node_base_data(df_target_relation):
df_target_relation = df_target_relation
node_list = list(set(df_target_relation['from_address'].to_list()+df_target_relation['to_address'].to_list()))
edges = list(set(df_target_relation.apply(lambda x: (x.from_address, x.to_address), axis=1).to_list()))
G.add_nodes_from(node_list)
G.add_edges_from(edges)
return node_list,edges
def add_node_attributes(df_target_label,df_key_list,df_vlaue_list,color_list):
for node, (n,p) in zip(G.nodes(), pos.items()):
G.nodes[node]['pos'] = p
G.nodes[node]['color'] = '#614433'
for id,label,layer_type,Balance_level in list(set(df_target_label.apply(lambda x: (x.address, x.label, x.level_type,x.Balance_level), axis=1).to_list())):
if node==id:
G.nodes[node]['label']=label
if Balance_level=='Large':
G.nodes[node]['size']=40
elif Balance_level=='Medium':
G.nodes[node]['size']=20
elif Balance_level=='Small':
G.nodes[node]['size']=10
elif Balance_level=='Huge':
G.nodes[node]['size']=80
for x,y,z in zip(df_key_list,df_vlaue_list,color_list):
target_list = df_target_label[df_target_label[x]==y]['address'].values.tolist()
if len(target_list)>0:
for id in target_list:
if id==node and G.nodes[node]['color']=='#614433':
G.nodes[node]['color'] = z
###############画出所有的边
def get_edge_trace(G):
xtext=[]
ytext=[]
edge_x = []
edge_y = []
for edge in G.edges():
x0, y0 = G.nodes[edge[0]]['pos']
x1, y1 = G.nodes[edge[1]]['pos']
xtext.append((x0+x1)/2)
ytext.append((y0+y1)/2)
edge_x.append(x0)
edge_x.append(x1)
edge_x.append(None)
edge_y.append(y0)
edge_y.append(y1)
edge_y.append(None)
xtext.append((x0+x1)/2)
ytext.append((y0+y1)/2)
edge_trace = go.Scatter(
x=edge_x, y=edge_y,
line=dict(width=0.5, color='#333'),
hoverinfo='none',
mode='lines')
eweights_trace = go.Scatter(x=xtext,y= ytext, mode='text',
marker_size=0.5,
text=[0.45, 0.7, 0.34],
textposition='top center',
hovertemplate='weight: %{text}<extra></extra>')
return edge_trace, eweights_trace
def get_node_trace(G):
node_x = []
node_y = []
for node in G.nodes():
x, y = G.nodes[node]['pos']
node_x.append(x)
node_y.append(y)
node_trace = go.Scatter(
x=node_x, y=node_y,
mode='markers',
hoverinfo='text',
marker=dict(
color=[],
colorscale = px.colors.qualitative.Plotly,
size=10,
line_width=0))
return node_trace
###############定义Graph
G = nx.Graph()
###############给Graph添加Node以及Edge
node_list = add_node_base_data(df_target_relation)[0]
edges = add_node_base_data(df_target_relation)[1]
# eweights_trace = add_node_base_data(df_target_relation)[1]
###############选择layout并得到相关node的pos
pos = nx.fruchterman_reingold_layout(G)
df_key_list = [ 'level_type' ,'account_type' , 'account_type' , 'account_type' ]
df_vlaue_list = [ 'Core' , 'EOA' , 'Cex Address' , 'Contract Address']
color_list = [ '#109947' ,'#0031DE' , '#F7F022' , '#E831D6' ]
###############给node添加label,Size,color属性
add_node_attributes(df_target_label,df_key_list,df_vlaue_list,color_list)
edge_trace, eweights_trace = get_edge_trace(G)
node_trace = get_node_trace(G)
###############定义color的规则
###############将node_text,node_size,node_color写入list
node_text = []
node_size = []
node_color = []
for node in G.nodes():
x = G.nodes[node]['label']
y = G.nodes[node]['size']
z = G.nodes[node]['color']
node_text.append(x)
node_size.append(y)
node_color.append(z)
# 依据设置label,size,color
node_trace.marker.color = node_color
node_trace.marker.size =node_size
node_trace.text = node_text
fig_target_id=go.Figure()
fig_target_id.add_trace(edge_trace)
fig_target_id.add_trace(node_trace)
fig_target_id.update_layout(
height=1000,
width=1000,
xaxis=dict(showgrid=False, zeroline=False, showticklabels=False),
yaxis=dict(showgrid=False, zeroline=False, showticklabels=False),
showlegend=False,
hovermode='closest',
)
return fig_target_id