zoukankan      html  css  js  c++  java
  • NetworkX系列教程(8)-Drawing Graph

    如果只是简单使用nx.draw,是无法定制出自己需要的graph,并且这样的graph内的点坐标的不定的,运行一次变一次,实际中一般是要求固定的位置,这就需要到布局的概念了.详细的画图信息可以看这里,代码中的关键部分使用了英文进行注释,不在另外注释.

    目录:


    注意:如果代码出现找不库,请返回第一个教程,把库文件导入.

    9.Drawing Graph

    9.1使用Matplotlib

    1. #定义graph 
    2. nodes=[0,1,2,3,4,5,'a','b','c'] 
    3. edges=[(0,1),(0,5),(1,2),(1,4),(2,1),(2,4),('a','b'),('b','c'),('c','a')] 
    4. G=nx.Graph() 
    5. G.add_nodes_from(nodes) 
    6. G.add_edges_from(edges) 
    7.  
    8. #使用spring_layout布局 
    9. pos=nx.spring_layout(G) 
    10.  
    11. plt.subplots(2,4,figsize=(18,6)) 
    12. plt.subplot(241) 
    13. plt.title('spring_layout') 
    14. nx.draw(G, with_labels=True, font_weight='bold') #Draw the graph G with Matplotlib. 
    15. plt.axis('on') 
    16. plt.xticks([]) 
    17. plt.yticks([]) 
    18.  
    19. plt.subplot(242) 
    20. plt.title('draw_networkx') 
    21. nx.draw_networkx(G) #Draw the graph G using Matplotlib. 
    22. plt.axis('on') 
    23. plt.xticks([]) 
    24. plt.yticks([]) 
    25.  
    26. plt.subplot(243) 
    27. plt.title('draw_networkx_nodes') 
    28. nx.draw_networkx_nodes(G,pos) #Draw the nodes of the graph G. 
    29. plt.axis('on') 
    30. plt.xticks([]) 
    31. plt.yticks([]) 
    32.  
    33. plt.subplot(244) 
    34. plt.title('draw_networkx_edges') 
    35. nx.draw_networkx_edges(G,pos) #Draw the edges of the graph G. 
    36. plt.axis('on') 
    37. plt.xticks([]) 
    38. plt.yticks([]) 
    39.  
    40. plt.subplot(245) 
    41. plt.title('draw_networkx_labels') 
    42. nx.draw_networkx_labels(G,pos) #Draw node labels on the graph G. 
    43. plt.axis('on') 
    44. plt.xticks([]) 
    45. plt.yticks([]) 
    46.  
    47. plt.subplot(246) 
    48. plt.title('draw_networkx_edge_labels') 
    49. nx.draw_networkx_edge_labels(G,pos) #Draw edge labels. 
    50. plt.axis('on') 
    51. plt.xticks([]) 
    52. plt.yticks([]) 
    53.  
    54. plt.subplot(247) 
    55. plt.title('draw_circular') 
    56. nx.draw_circular(G,) #Draw the graph G with a circular layout. 
    57. plt.axis('on') 
    58. plt.xticks([]) 
    59. plt.yticks([]) 
    60.  
    61. plt.subplot(248) 
    62. plt.title('draw_kamada_kawai') 
    63. nx.draw_kamada_kawai(G) #Draw the graph G with a Kamada-Kawai force-directed layout. 
    64. plt.axis('on') 
    65. plt.xticks([]) 
    66. plt.yticks([]) 
    67. plt.show() 
    68. plt.close() 
    69.  
    70. plt.subplots(1,4,figsize=(18,3)) 
    71. plt.subplot(141) 
    72. plt.title('draw_random') 
    73. nx.draw_random(G) #Draw the graph G with a random layout. 
    74. plt.axis('on') 
    75. plt.xticks([]) 
    76. plt.yticks([]) 
    77.  
    78. plt.subplot(142) 
    79. plt.title('draw_spectral') 
    80. nx.draw_spectral(G,) #Draw the graph G with a spectral layout. 
    81. plt.axis('on') 
    82. plt.xticks([]) 
    83. plt.yticks([]) 
    84.  
    85. plt.subplot(143) 
    86. plt.title('draw_spring') 
    87. nx.draw_spring(G) #Draw the graph G with a spring layout. 
    88. plt.axis('on') 
    89. plt.xticks([]) 
    90. plt.yticks([]) 
    91.  
    92. plt.subplot(144) 
    93. plt.title('draw_shell') 
    94. nx.draw_shell(G) #Draw networkx graph with shell layout. 
    95. plt.axis('on') 
    96. plt.xticks([]) 
    97. plt.yticks([]) 
    98.  
    99. plt.show() 

    png
    Matplotlib布局1

    png
    Matplotlib布局2

    9.2使用Graphviz AGraph (dot)

    有些同学不知道如何安装Graphviz,我在这里作一个说明:
    1.linux是安装graphviz即可,我使用的命令是:

    1. sudo apt install graphviz 

    2.Windows我没用实践过,不过我查到Graphviz有官网,里面有windows安装包,地址看下:
    http://www.graphviz.org/download/

    1. G.clear() 
    2. from networkx.drawing.nx_pydot import write_dot,read_dot 
    3.  
    4. plt.subplots(1,3,figsize=(15,5)) 
    5. K5 = nx.complete_graph(5) 
    6.  
    7. A = nx.nx_agraph.to_agraph(K5) #Return a pygraphviz graph from a NetworkX graph N. 
    8. G1 = nx.nx_agraph.from_agraph(A) #Return a NetworkX Graph or DiGraph from a PyGraphviz graph. 
    9. plt.subplot(131) 
    10. plt.title('原图',fontproperties=myfont) 
    11. nx.draw_random(G1) #Draw the graph G with a random layout. 
    12. plt.axis('on') 
    13. plt.xticks([]) 
    14. plt.yticks([]) 
    15.  
    16. write_dot(G1, 'graph.test') #Write NetworkX graph G to Graphviz dot format on path. 
    17. G2=read_dot('graph.test') #Return a NetworkX graph from a dot file on path. 
    18. plt.subplot(132) 
    19. plt.title('保存原图后并读取',fontproperties=myfont) 
    20. nx.draw_random(G2) #Draw the graph G with a random layout. 
    21. plt.axis('on') 
    22. plt.xticks([]) 
    23. plt.yticks([]) 
    24.  
    25. G3 = nx.petersen_graph() 
    26. pos = nx.nx_agraph.graphviz_layout(G3) #Create node positions for G using Graphviz. 
    27.  
    28. plt.subplot(133) 
    29. plt.title('graphviz_layout',fontproperties=myfont) 
    30. nx.draw_random(G3) #Draw the graph G with a random layout. 
    31. plt.axis('on') 
    32. plt.xticks([]) 
    33. plt.yticks([]) 
    34.  
    35. plt.show() 

    png
    Graphviz画图

    9.3图布局

    1. #定义graph 
    2. nodes=[0,1,2,3,4,5,'a','b','c'] 
    3. edges=[(0,1),(0,5),(1,2),(1,4),(2,1),(2,4),('a','b'),('b','c'),('c','a')] 
    4. G=nx.Graph() 
    5. G.add_nodes_from(nodes) 
    6. G.add_edges_from(edges) 
    7.  
    8. plt.subplots(2,3,figsize=(18,6)) 
    9. plt.subplot(231) 
    10. plt.title('circular_layout') 
    11. pos=nx.circular_layout(G) #Position nodes on a circle. 
    12. nx.draw(G,pos, with_labels=True, font_weight='bold') 
    13. plt.axis('on') 
    14. plt.xticks([]) 
    15. plt.yticks([]) 
    16.  
    17. plt.subplot(232) 
    18. plt.title('kamada_kawai_layout') 
    19. pos=nx.kamada_kawai_layout(G) #Position nodes using Kamada-Kawai path-length cost-function. 
    20. nx.draw(G, pos,with_labels=True, font_weight='bold') 
    21. plt.axis('on') 
    22. plt.xticks([]) 
    23. plt.yticks([]) 
    24.  
    25. plt.subplot(233) 
    26. plt.title('random_layout') 
    27. pos=nx.random_layout(G) #Position nodes uniformly at random in the unit square. 
    28. nx.draw(G, pos,with_labels=True, font_weight='bold') 
    29. plt.axis('on') 
    30. plt.xticks([]) 
    31. plt.yticks([]) 
    32.  
    33. plt.subplot(234) 
    34. plt.title('shell_layout') 
    35. pos=nx.shell_layout(G) #Position nodes in concentric circles. 
    36. nx.draw(G, pos,with_labels=True, font_weight='bold') 
    37. plt.axis('on') 
    38. plt.xticks([]) 
    39. plt.yticks([]) 
    40.  
    41. plt.subplot(235) 
    42. plt.title('spring_layout') 
    43. pos=nx.spring_layout(G)#Position nodes using Fruchterman-Reingold force-directed algorithm. 
    44. nx.draw(G, pos, with_labels=True, font_weight='bold') 
    45. plt.axis('on') 
    46. plt.xticks([]) 
    47. plt.yticks([]) 
    48.  
    49. plt.subplot(236) 
    50. plt.title('spectral_layout') 
    51. pos=nx.spectral_layout(G) #Position nodes using the eigenvectors of the graph Laplacian. 
    52. nx.draw(G, pos, with_labels=True, font_weight='bold') 
    53. plt.axis('on') 
    54. plt.xticks([]) 
    55. plt.yticks([]) 
    56.  
    57. plt.show() 

    png
    图布局

  • 相关阅读:
    ASP.NET Cache的一些总结分享
    C#中委托和事件的区别实例解析
    [hdu2544]最短路spfa
    [codeforces274b]Zero Tree(树形dp)
    [poj2151]Check the difficulty of problems概率dp
    [poj3071]football概率dp
    [poj3744]Scout YYF I(概率dp+矩阵快速幂)
    [bzoj2440]完全平方数(二分+mobius反演)
    [xdoj1216]子树第k小(dfs序+主席树)
    [xdoj1233]Glory and LCS
  • 原文地址:https://www.cnblogs.com/wushaogui/p/9206144.html
Copyright © 2011-2022 走看看