Python之網絡模型與圖形繪製工具networkx

筆記

# https://www.jianshu.com/p/e543dc63454f
import networkx as nx
import matplotlib.pyplot as plt

 ############################################################################# (建立)初始化圖模型
"""
nx.Graph() 簡單無向圖 
g = nx.DiGraph() 簡單有向圖
g = nx.Grap(),DiGraph() 有自環 
nx.MultiGraph(), nx.MultiDiGraph() 有重邊
"""
g = nx.Graph()  
g.clear()  # 將圖上元素清空

 ############################################################################## 添加節點
"""
+ 節點能夠是任意數據類型
+ 添加一個節點 g.add_node(ele)
    g.add_node(1)
    g.add_node("a")
    g.add_node("spam")
+ 添加一組節點:提早構建好了一個節點列表,將其一次性加進來,這跟後邊加邊的操做是具備一致性的 g.add_nodes_from(eles)
    g.add_nodes_from([2,3])
    g.add_nodes_from(a)  # 其中,a = [2,3]
+ 區別:
    g.add_node("spam") # 添加了一個名爲spam的節點
    g.add_nodes_from("spam") # 添加了4個節點,名爲s,p,a,m
    g.nodes() # 可將以上5個節點打印出來看看
+ 其它: 加一組從0開始的連續數字的節點
    H = nx.path_graph(10)
    g.add_nodes_from(H) # 將0~9加入了節點 # #但請勿使用g.add_node(H)
"""
# g.add_node("spam") # 添加了一個名爲spam的節點
# g.add_nodes_from(["a","b","c","d","e","f"]) # 添加了4個節點,名爲s,p,a,m

H = nx.path_graph(4)
g.add_nodes_from(H) # 將0~9加入了節點 # #但請勿使用g.add_node(H)
 ############################################################################## 移除節點
"""
+ 與添加節點同理
"""
# g.remove_node(node_name)
# g.remove_nodes_from(nodes_list)

 ############################################################################## 添加邊
"""
+ 邊是由對應節點的名字的元組組成,加一條邊
+ 加入一條邊 g.add_edge(eleA,eleB)
    g.add_edge(1,2);
    e = (2,3);
    g.add_edge(*e) #直接g.add_edge(e)數據類型不對,*是將元組中的元素取出
+ 加入一組邊 g.add_edges_from([(eleA,eleB),...,(eleC,eleD)])
    g.add_edges_from([(1,2),(1,3)])
    g.add_edges_from([("a","spam") , ("a",2)])
+ 加入一組系列連續的邊 nx.path_graph(n)
    n = 10
    H = nx.path_graph(n)
    g.add_edges_from(H.edges()) #添加了0~1,1~2 ... n-2~n-1這樣的n-1條連續的邊
+ 補充
    G.add_weight_edges_from(list)
    G.add_weight_edge(1,2,3.0) # 第三個是權值
    G.add_edges_from(list) # 添加列表中的邊
"""
# g.add_edge(1,2);
# e = (2,3);
# g.add_edge(*e) #直接g.add_edge(e)數據類型不對,*是將元組中的元素取出
 ##############################################################################  刪除邊
"""
g.remove_edge(edge)
g.remove_edges_from(edges_list)
"""

 ##############################################################################  查看圖上節點和邊的信息
""" g = nx.Graph(day="Monday") 
g.graph # {'day': 'Monday'} # 查看圖模型
g.graph['day'] = 'Tuesday' # g.graph # {'day': 'Tuesday'} # 修改圖模型
g.number_of_nodes() # 查看點的數量
g.number_of_edges() # 查看邊的數量
g.nodes() # 返回全部點的信息(list)
g.edges() # 返回全部邊的信息(list中每一個元素是一個tuple)
g.neighbors(1) # 全部與1這個點相連的點的信息以列表的形式返回

+ 節點屬性設置 
    g.add_node('benz', money=10000, fuel="1.5L")
    print g.node['benz'] # {'fuel': '1.5L', 'money': 10000}
    print g.node['benz']['money'] # 10000
    print g.nodes(data=True) # data默認false就是不輸出屬性信息,修改成true,會將節點名字和屬性信息一塊兒輸出
    g[1]  #查看全部與1相連的邊的屬性,格式輸出:{0: {}, 2: {}} 表示1和0相連的邊沒有設置任何屬性(也就是{}沒有信息),同理1和2相連的邊也沒有任何屬性
+ Directed graphs
    + DG = nx.DiGraph()
    + DG.add_weighted_edges_from([(1,2,0.5), (3,1,0.75), (1,4,0.3)]) # 添加帶權值的邊
    + DG.out_degree(1) # 打印結果:2 表示:找到1的出度
    + DG.out_degree(1, weight='weight') # 打印結果:0.8 表示:從1出去的邊的權值和,這裏權值是以weight屬性值做爲標準,若是你有一個money屬性,那麼也能夠修改成weight='money',那麼結果就是對money求和了
    + DG.successors(1) # [2,4] 表示1的後繼節點有2和4
    + DG.predecessors(1) # [3] 表示只有一個節點3有指向1的連邊
+ MG=nx.MultiGraph()
    MG.add_weighted_edges_from([(1,2,.5), (1,2,.75), (2,3,.5)])
    print MG.degree(weight='weight') # {1: 1.25, 2: 1.75, 3: 0.5}
    GG=nx.Graph()
    for n,nbrs in MG.adjacency_iter():
        for nbr,edict in nbrs.items():
            minvalue=min([d['weight'] for d in edict.values()])
            GG.add_edge(n,nbr, weight = minvalue)
    print nx.shortest_path(GG,1,3) # [1, 2, 3]
"""
print(g.nodes(data=True))

 ############################################################################## 繪製圖像 (畫布)
nx.draw(g,with_labels=True)
# nx.draw(g) # 繪製
# nx.draw(g, pos=nx.spectral_layout(g), nodecolor='y', edge_color='b');
# nx.draw_networkx(BG, pos, edges=edges, labels=labels) # BG = nx.Graph() ; edges = BG.edges();pos = dict() ; labels = dict((n, "(" + n + "," + d['_type'] + ")") for n,d in BG.nodes(data=True))
 ############################################################################## 顯示圖像
"""
plt.show() # 控制檯顯示圖像
plt.savefig("C:/Users/千千寰宇/Desktop/path.png") # 存儲圖像 (存儲/顯示)二選一
"""
plt.show()
# plt.savefig("C:/Users/千千寰宇/Desktop/path.png") # 存儲圖像 (存儲/顯示)二選一

Demo

# coding = utf-8
import networkx as nx
import matplotlib.pyplot as plt

# 解決圖像中的中文亂碼問題
plt.rcParams['font.sans-serif'] = ['SimHei'] 
plt.rcParams['font.family']='sans-serif'

g = nx.DiGraph();
g.clear();

g.add_edge("可愛","菇涼",label="test",weight=4.7);
g.add_edge("漂亮","菇涼",weight=0.98);
g.add_edge("悲傷","菇涼");

g.edges["悲傷", "菇涼"]['color'] = "blue"

g["可愛"]["菇涼"]['color'] = "yellow"
print(g);
# g.add_node("可愛")
# g.add_node("漂亮");
# g.add_node("悲傷");

# g.add_node("菇涼");

print(g.nodes())
print(g.nodes().data()) # 顯示邊的數據
print(g.edges().data())


 # nx.draw(g,with_labels=True) # 顯示節點的名稱

 #  顯示邊的標籤信息
pos=nx.spring_layout(g);
nx.draw_spring(g,with_labels=True); # 顯示節點的名稱
nx.draw_networkx_edge_labels(g,pos,font_size=14,alpha=0.5,rotate=True); 

plt.axis('off')
plt.show()
# output
['可愛', '菇涼', '漂亮', '悲傷']
[('可愛', {}), ('菇涼', {}), ('漂亮', {}), ('悲傷', {})]
[('可愛', '菇涼', {'label': 'test', 'weight': 4.7, 'color': 'yellow'}), ('漂亮', '菇涼', {'weight': 0.98}), ('悲傷', '菇涼', {'color': 'blue'})]
相關文章
相關標籤/搜索