2016-07-05 125 views
1

我在嘗試本教程:"Networks on Maps (with Python)"。在原作者的善意幫助下,我已經掌握了大部分工作。它最初是在Python 2.7中創建的,我使用的是3.5。更改包括graphml格式的數據(不是pickle),插入缺少的參數,並指定G = nx.Graph()。檢索部分密鑰的部分密鑰'... - Networkx

我現在堅持朝着錯誤的結尾:

NameError: name 'part' is not defined. 

我有點不確定,如果它是一個2.7-3.5衝突,如果有一個功能缺失?

下面的代碼:

import matplotlib.pyplot as plt 
import networkx as nx 
from mpl_toolkits.basemap import Basemap 
import difflib 

m = Basemap(projection='robin',lon_0=0,resolution='l') 

m.drawcountries(linewidth = 0.5) 
m.fillcontinents(color='white',lake_color='white') 
m.drawcoastlines(linewidth=0.5) 

# load geographic coordinate system for countries 
import csv 
country = [row[0].strip() for row in csv.reader(open('LonLat.csv'), delimiter=';')] # clear spaces 
lat = [float(row[1]) for row in csv.reader(open('LonLat.csv'), delimiter=';')] 
lon = [float(row[2]) for row in csv.reader(open('LonLat.csv'), delimiter=';')] 

G=nx.Graph() 

# define position in basemap 
    position = {} 
    for i in range(0, len(country)): 
     position[country[i]] = m(lon[i], lat[i]) 

    def similar(landstring, country): 
     l = difflib.get_close_matches(landstring, country, 1) 
     return l[0] 

    pos = dict((land, position[similar(land, country)]) for land in G.nodes()) 

    nx.draw_networkx_nodes(G, pos, nodelist = [**key for key in part if part[key] == 0**], 
     node_size = [deg_weight[s]*10 for s in part if part[s] == 0], 
     node_color = 'red', node_shape='^', alpha=0.8) 
     nx.draw_networkx_nodes(G, pos, nodelist = [key for key in part if part[key] == 1], 
     node_size = [deg_weight[s]*20 for s in part if part[s] == 1], 
     node_color = 'black', node_shape='d') 
     nx.draw_networkx_nodes(G, pos, nodelist = [key for key in part if part[key] == 2], 
     node_size = [deg_weight[s]*10 for s in part if part[s] == 2], 
     node_color = 'green', node_shape='o') 
     nx.draw_networkx_nodes(G, pos, nodelist = [key for key in part if part[key] == 3], 
     node_size = [deg_weight[s]*10 for s in part if part[s] == 3], 
     node_color = 'blue', alpha=0.8) 
     nx.draw_networkx_edges(G, pos, color='grey', width = 0.75, alpha=0.2) 
     plt.show() 

感覺就像這個答案(How to retrieve or iterate over edge keys in python networkx MultiDiGraph),這個答案(Python Tulpe Key For Dict Partial Lookup),而這個答案(How to access keys in nodes and edges in NetworkX MultiDiGraph)在正確的方向指向,但我不能讓足夠的鏈接。

任何輸入將不勝感激。我很樂意讓它充分發揮作用。

+0

這是筆誤,應該'part'改爲'pos'?你會得到名稱錯誤,因爲在這段代碼中沒有任何地方分配了'part'。 –

+0

它很可能。我之前用'pos'取代了所有'部分',但它沒有奏效。自從你提起來之後,我會再試一次。 –

+0

至少,這不應該給你一個'NameError',但它可能會因爲其他一些原因失敗。我簡單地看了一下你提供的例子,並且我看到類似的斷開連接,在這些列表解析之前沒有提及「部分」。 –

回答

0

下面的代碼幾乎完全工作。一些小問題仍然存在,例如地圖出現在邊緣和節點的「上方」,「deg_weight」沒有定義,但它大部分是有效的。如果我完全解決問題,我會發布。在這裏發佈任何有興趣的人。感謝Raphael Heiberger博士的慷慨幫助。

#import sys 
#sys.version 
#'3.5.1 |Anaconda 4.0.0 (64-bit)... 

# import modules 
import matplotlib.pyplot as plt 
import networkx as nx 
from mpl_toolkits.basemap import Basemap 
import csv 
import difflib 
import community # https://bitbucket.org/taynaud/python-louvain 

# define map 
m = Basemap(projection='robin',lon_0=0,resolution='l') 
m.drawcountries(linewidth = 0.5) 
m.fillcontinents(color='white',lake_color='white') 
m.drawcoastlines(linewidth=0.5) 

# load geographic coordinates for countries 
country = [row[0].strip() for row in csv.reader(open('LonLat.csv'), delimiter=';')] # clear spaces 
lat = [float(row[1]) for row in csv.reader(open('LonLat.csv'), delimiter=';')] 
lon = [float(row[2]) for row in csv.reader(open('LonLat.csv'), delimiter=';')] 

# load data 
G = nx.read_graphml('data.graphml') 

# define position in basemap 
position = {} 
for i in range(0, len(country)): 
    position[country[i]] = m(lon[i], lat[i]) 

def similar(landstring, country): 
    l = difflib.get_close_matches(landstring, country, 1) 
    return l[0] 

pos = dict((land, position[similar(land, country)]) for land in G.nodes()) 

part = community.best_partition(G) 

# draw graph 
nx.draw_networkx_nodes(G, pos, nodelist = [key for key in part if part[key] == 0], 
         node_size = [deg_weight[s]*10 for s in part if part[s] == 0], 
         node_color = 'red', node_shape='^', alpha=0.8) 
nx.draw_networkx_nodes(G, pos, nodelist = [key for key in part if part[key] == 1], 
         node_size = [deg_weight[s]*20 for s in part if part[s] == 1], 
         node_color = 'black', node_shape='d') 
nx.draw_networkx_nodes(G, pos, nodelist = [key for key in part if part[key] == 2], 
         node_size = [deg_weight[s]*10 for s in part if part[s] == 2], 
         node_color = 'green', node_shape='o') 
nx.draw_networkx_nodes(G, pos, nodelist = [key for key in part if part[key] == 3], 
         node_size = [deg_weight[s]*10 for s in part if part[s] == 3], 
         node_color = 'blue', alpha=0.8) 
nx.draw_networkx_edges(G, pos, color='grey', width = 0.75, alpha=0.2) 

#print/generate plot 
plt.show()