首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在Python networkx中的节点名旁边添加节点属性?

如何在Python networkx中的节点名旁边添加节点属性?
EN

Stack Overflow用户
提问于 2018-08-16 03:13:33
回答 1查看 1.6K关注 0票数 1

我想画一个连接同事和电影偏好的二部图。如何在图形中同时显示节点中的节点名称(即moviename或can )和节点属性(无论是同事还是电影)?

我当前的代码只显示了node属性并删除了节点名。

我的代码:

代码语言:javascript
复制
BG = nx.Graph()
BG.add_nodes_from(employees, bipartite=0, _type='employee')
BG.add_nodes_from(movies, bipartite=1, _type='movie')
edgeinfo = pd.read_csv('Employee_Movie_Choices.txt', sep='\t')
edges = [tuple(x) for x in edgeinfo.values]
BG.add_edges_from(edges)

labels = dict((n,d['_type']) for n,d in BG.nodes(data=True))

%matplotlib notebook
import matplotlib.pyplot as plt

plt.figure()
pos = nx.spring_layout(BG)
edges = BG.edges()
nx.draw_networkx(BG, pos, edges=edges, labels=labels)

如果我创建标签元组,他会给我一个错误:

代码语言:javascript
复制
BG = nx.Graph()
BG.add_nodes_from(employees, bipartite=0, _type='employee')
BG.add_nodes_from(movies, bipartite=1, _type='movie')
edgeinfo = pd.read_csv('Employee_Movie_Choices.txt', sep='\t')
edges = [tuple(x) for x in edgeinfo.values]
BG.add_edges_from(edges)

labels = dict((n,d['_type']) for n,d in BG.nodes(data=True))  ###ik krijg hier naam movie en employee niet meer bij !!!
labels_new = [(k, v) for k, v in labels.items()]
#labels = [tuple(n,d['_type']) for n, d in BG.nodes(data=True)]
#nx.draw(BG, labels=labels)

%matplotlib notebook
import matplotlib.pyplot as plt

plt.figure()
pos = nx.spring_layout(BG)
edges = BG.edges()
nx.draw_networkx(BG, pos, edges=edges, labels=labels_new)

错误:-> nx.draw_networkx(BG,pos,edges=edges,labels=labels_new) AttributeError:'list‘对象没有'items’属性

EN

回答 1

Stack Overflow用户

发布于 2018-08-16 06:04:44

出现错误的原因

draw_networkx的文档中,labels需要是一个字典,而您馈送的labels_new是一个列表。

标签(字典,可选(default=None)) -字典中的节点标签,以文本标签的节点为关键字

从你的代码中,

labels.items()中k,v的

labels_new=(k,v)

因此,出现了错误AttributeError: 'list' object has no attribute 'items'

解决方法:自定义labels dictionary

我没有数据,但可以快速破解一下

代码语言:javascript
复制
labels = dict((n, "(" + n + "," + d['_type'] + ")") for n,d in BG.nodes(data=True))

演示

代码语言:javascript
复制
import networkx as nx
from networkx.algorithms import bipartite
%matplotlib notebook
import matplotlib.pyplot as plt

BG = nx.Graph()
employees = [str(i) for i in range(3)]
movies = ["mA", "mB", "mC"]
BG.add_nodes_from(employees, bipartite=0, _type='emp')
BG.add_nodes_from(movies, bipartite=1, _type='mov')
edges = [("0", "mA"), ("0", "mC"), ("1", "mA"),("1", "mB"), ("2", "mA")]
BG.add_edges_from(edges)
labels = dict((n, "(" + n + "," + d['_type'] + ")") for n,d in BG.nodes(data=True))

# Setting up pos for drawing bipartite graph. See the reference for more info
X, Y = bipartite.sets(BG)
pos = dict()
pos.update( (n, (1, i)) for i, n in enumerate(X) ) # put nodes from X at x=1
pos.update( (n, (2, i)) for i, n in enumerate(Y) ) # put nodes from Y at x=2

plt.figure()
edges = BG.edges()
nx.draw_networkx(BG, pos, edges=edges, labels=labels)

参考

mdml's answer for drawing bipartite graph

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

https://stackoverflow.com/questions/51865003

复制
相关文章

相似问题

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