networkx和dict_values导致浮点参数错误

时间:2018-08-25 00:13:44

标签: python-3.x networkx

我试图按照下面给出的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')

但是我仍然遇到相同的错误。有什么建议吗?

1 个答案:

答案 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())