首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在NetworkX中的其余节点上对前20个节点进行着色

如何在NetworkX中的其余节点上对前20个节点进行着色
EN

Stack Overflow用户
提问于 2021-09-03 19:17:19
回答 2查看 143关注 0票数 1

有谁知道如何在NetworkX中的其他节点上涂上前20个节点的颜色?我想用绿色涂上前20个节点的颜色,其余的用灰色表示。然而,输出只显示灰色,因为绿色节点在灰色节点之下。是否有可能使这些绿色节点在灰色节点之上?

此外,是否可以显示前20个绿色节点的大小为20个,其余的灰色节点的大小为10个?目前,所有节点的大小为10。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-09-03 20:45:39

尝试:

设置一个MRE

代码语言:javascript
复制
import pandas as pd
import numpy as np
import networkx as nx
import matplotlib.pyplot as plt
import string

df = pd.DataFrame({'ID': list(string.ascii_uppercase),
                   'PageRank': np.random.randint(10, 100, len(string.ascii_uppercase))})

top_5_lst = df.sort_values('PageRank')['ID'].head(5).tolist()
not_top_5_lst = df.loc[~df['ID'].isin(top_5_lst), 'ID'].tolist()

edges = pd.DataFrame({'from': np.random.choice(list(string.ascii_uppercase), 1000),
                      'to': np.random.choice(list(string.ascii_uppercase), 1000)})

G = nx.from_pandas_edgelist(edges, source='from', target='to')

要实现您的期望,您必须手动控制图形绘制,特别是z阶图。你可以:

代码语言:javascript
复制
# Compute positions
pos = nx.spring_layout(G)

# Draw nodes not in top5
pc1 = nx.draw_networkx_nodes(G, pos, nodelist=not_top_5_lst,
                             node_color='gray', node_size=10)

# Draw top5 nodes
pc2 = nx.draw_networkx_nodes(G, pos, nodelist=top_5_lst, 
                             node_color='#00D992', node_size=20)
pc2.zorder = 3  # set z-order to 3 (2 by default for gray nodes)

# Draw edges
lc = nx.draw_networkx_edges(G, pos, width=0.2)

plt.show()

票数 3
EN

Stack Overflow用户

发布于 2021-09-04 23:16:46

应@Corr外星人的请求,我将尝试在上面添加一些内容。如果您可以使用一个非networkx包,您也可以使用Plotly来做您要求做的事情,这给交互带来了额外的好处。您可以遵循类似的示例这里

设置完全相同的MRE

代码语言:javascript
复制
import pandas as pd
import numpy as np
import networkx as nx
import matplotlib.pyplot as plt
import plotly.graph_objects as go
import string

df = pd.DataFrame({'ID': list(string.ascii_uppercase),
                   'PageRank': np.random.randint(10, 100, len(string.ascii_uppercase))})

top_5_lst = df.sort_values('PageRank')['ID'].head(5).tolist()
not_top_5_lst = df.loc[~df['ID'].isin(top_5_lst), 'ID'].tolist()

edges = pd.DataFrame({'from': np.random.choice(list(string.ascii_uppercase), 1000),
                      'to': np.random.choice(list(string.ascii_uppercase), 1000)})

G = nx.from_pandas_edgelist(edges, source='from', target='to')
pos = nx.spring_layout(G)

将页面排名设置为节点的属性。我们将使用这个添加一个工具提示

代码语言:javascript
复制
rank_dict = dict(zip(df.ID, df.PageRank))
for entry in rank_dict:
    rank_dict[entry] = {'Page Rank': rank_dict[entry]}
    
nx.set_node_attributes(G, rank_dict)

设置边缘:

代码语言:javascript
复制
edge_x = []
edge_y = []
for edge in G.edges():
    x0, y0 = pos[edge[0]]
    x1, y1 = pos[edge[1]]
    edge_x.append(x0)
    edge_x.append(x1)
    edge_x.append(None)
    edge_y.append(y0)
    edge_y.append(y1)
    edge_y.append(None)

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

按页面级别和其余节点分别为前5个节点设置一个跟踪。

代码语言:javascript
复制
# Not Top 5 Nodes
g1_node_x = []
g1_node_y = []
g1_texts = []
# Top 5 Nodes
g2_node_x = []
g2_node_y = []
g2_texts = []
for node in G.nodes():
    x, y = pos[node]
    if node in not_top_5_lst:
        g1_node_x.append(x)
        g1_node_y.append(y)
        g1_texts.append('Page Rank: '+str(G.nodes[node]['Page Rank']))
    else:
        g2_node_x.append(x)
        g2_node_y.append(y)
        g2_texts.append('Page Rank: '+str(G.nodes[node]['Page Rank']))

node_trace = go.Scatter(
    x=g1_node_x, y=g1_node_y,
    mode='markers',
    hoverinfo='text',
    marker=dict(
        color='grey',
        size=10,
        line_width=2))

node_trace2 = go.Scatter(
    x=g2_node_x, y=g2_node_y,
    mode='markers',
    hoverinfo='text',
    marker=dict(
        color='green',
        size=20,
        line_width=2))

node_trace.text = g1_texts
node_trace2.text = g2_texts

最后,创建巧妙的图形并添加每个跟踪。然后按需要更新您的布局。实际上,通过将元素添加到跟踪中的顺序来排序元素,因此只要顶部元素节点在底部元素节点之后绘制,它们就会出现在前面。

代码语言:javascript
复制
fig = go.Figure(edge_trace)
fig = fig.add_trace(node_trace)
fig = fig.add_trace(node_trace2)

fig = fig.update_layout(titlefont_size=16,
                showlegend=False,
                hovermode='closest',
                margin=dict(b=20,l=5,r=5,t=40),
                annotations=[ dict(
                    text="",
                    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()

结果:

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69049689

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档