【问题标题】:Simplify networkx node labels简化networkx节点标签
【发布时间】:2019-10-28 17:32:35
【问题描述】:
%matplotlib inline
import networkx as nx
import matplotlib.pyplot as plt

G = nx.Graph()
G.add_node('abc@gmail.com')
nx.draw(G, with_labels=True)
plt.show()

输出图为

我想要的是

我在 csv 文件中有数千条从 person@email.com 到 another@email.com 的电子邮件记录,我使用 G.add_node(email_address)G.add_edge(from, to) 构建 G。我想将整个电子邮件地址保留在 Graph G 中,但是以简化的字符串显示。

【问题讨论】:

  • 为什么不加G.add_node('abc')
  • 其实第二个图是按你说的那样生成的,但是我在一个csv文件中有很多电子邮件地址,我想在图中保存更多信息。
  • 您需要处理这些,遍历电子邮件地址,使用@ 拆分字符串并只取电子邮件地址的左侧部分
  • 把它作为先决条件放在问题中
  • 看看这个答案的第二部分stackoverflow.com/a/28533293/2966723

标签: python networkx


【解决方案1】:

networkx 有一个名为 relabel_nodes 的方法,它接受一个图形 (G)、一个 mapping(重新标记规则)并返回一个新图形 (new_G),其中节点重新标记。

也就是说,在你的情况下:

import networkx as nx
import matplotlib.pyplot as plt

G = nx.Graph()
G.add_node('abc@gmail.com')
mapping = {
   'abc@gmail.com': 'abc'
}
relabeled_G = nx.relabel_nodes(G,mapping)
nx.draw(relabeled_G, with_labels=True)
plt.show()

这样您就可以保持G 完整并具有简化的标签。

您可以选择就地修改标签,而无需新副本,在这种情况下,您只需调用G = nx.relabel_nodes(G, mapping, copy=False)

如果你事先不知道邮箱地址,你可以传递relabel_nodes一个函数,像这样:

G = nx.relabel_nodes(G, lambda email: email.split("@")[0], copy=False)

【讨论】:

  • 我刚刚完成我的代码只发现 nx.relabel_nodes 替换了 .gexf 文件中的所有节点名称,它就像 G.add_node('abc') 和 '@gmail.com' 完全消失了
猜你喜欢
  • 2023-01-02
  • 1970-01-01
  • 2017-10-09
  • 1970-01-01
  • 2014-11-10
  • 2019-05-06
  • 1970-01-01
  • 1970-01-01
  • 2015-04-16
相关资源
最近更新 更多