我试图按照下面给出的here代码进行“可重复性”教程,但是当我尝试对第一次可视化使用draw()时却陷入困境
import networkx as nx
import matplotlib.pyplot as plt
import matplotlib.colors as mcolors
def draw(G, pos, measures, measure_name):
nodes = nx.draw_networkx_nodes
(G, pos, node_size=250,cmap=plt.cm.plasma,
node_color=measures.values(),
nodelist=measures.keys())
nodes.set_norm(mcolors.SymLogNorm(linthresh=0.01, linscale=1))
edges = nx.draw_networkx_edges(G, pos)
plt.title(measure_name)
plt.colorbar(nodes)
plt.axis('off')
plt.show()
G = nx.karate_club_graph()
pos = nx.spring_layout(G)
draw(G, pos, nx.degree_centrality(G), 'Degree Centrality')
回溯一直显示错误: float()参数必须是字符串或数字,而不是'dict_values'
基于此question
我认为这是python 3问题。我尝试过
draw(G, np.array(list(pos.values())).astype(float),
nx.degree_centrality(G), 'Degree Centrality')
但是我仍然遇到相同的错误。有什么建议吗?
答案 0 :(得分:1)
该代码在python2.7上正常工作。
原因是measures.values()
的类型在Python 2和3之间不同。
确实,在python 2.7中dict.values返回列表,而在python 3.x中,它返回字典值的视图。
d={"k":"v"}
#python 2.7
type(d.values()) ---> <type 'list'>
#python 3.x
type(d.values()) ---> <class 'dict_values'>
因此,您引发了TypeError
异常,因为预期node_color
是字符串或浮点数数组,并且参数的类型为dict_values
。有关更多详细信息,请参见文档here。
要解决此问题,您只需更改将节点颜色传递给draw_networkx_nodes
函数的方式。
例如,您可以使用如下列表:
nodes = nx.draw_networkx_nodes(G, pos, node_size=250, cmap=plt.cm.plasma, node_color=list(measures.values()),nodelist=measures.keys())