微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何根据图的模块化改变 networkx 图中节点的颜色

如何解决如何根据图的模块化改变 networkx 图中节点的颜色

目前,我有一个 NetworkX 图,它根据度中心性改变节点的颜色和大小,但我希望不是基于度中心性改变颜色,而是基于模块化改变节点的颜色,在计算模块性时最好使用标签传播。

我已经尝试以与根据程度中心性更改的代码相同的方式更改颜色,但只会因为程度中心性有多个值而模块性只有一个值而出错。

预期的结果是让节点的颜色根据模块性而不是度中心性而变化,同时保持基于度中心性的节点大小。

此项目中使用的 CSV 文件可在此处获得: https://www.mediafire.com/file/q0kziy9h251fcjf/nutrients.csv/file

这是项目的代码

import networkx as nx
import matplotlib.pyplot as plt
import networkx.algorithms.community as nx_com
import numpy as np

# create graph from data
with open("nutrients.csv","r") as f:
    G = nx.parse_edgelist(f.readlines(),delimiter=",")

# centrality
deg_centrality = nx.degree_centrality(G)
centrality = np.fromiter(deg_centrality.values(),float)

# modularity
mod = nx_com.modularity(G,nx_com.label_propagation_communities(G))

# plot
pos = nx.spring_layout(G)
nx.draw(G,pos,node_color=centrality,node_size=centrality*2e3)
nx.draw_networkx_labels(G,pos)
plt.show()

解决方法

我解决了这个问题。答案在这里

import networkx as nx
import matplotlib.pyplot as plt
import networkx.algorithms.community as nx_com
import numpy as np
import community as community_louvain

# create graph from data
with open("nutrients.csv","r") as f:
    G = nx.parse_edgelist(f.readlines(),delimiter=",")

# centrality
deg_centrality = nx.degree_centrality(G)
centrality = np.fromiter(deg_centrality.values(),float)

# modularity
label = community_louvain.best_partition(G)
mod = community_louvain.modularity(label,G)
values = [label.get(node) for node in G.nodes()]


# plot
pos = nx.spring_layout(G)
nx.draw(G,pos,node_color=values,node_size=centrality*2e3)
nx.draw_networkx_labels(G,pos)
plt.show()

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。