zoukankan      html  css  js  c++  java
  • 【Python】python 学习笔记 --画图(networkx)

    【Python】python 学习笔记 --画图(networkx)

    绘制基本网络图

    用matplotlib绘制网络图
    基本流程:
    1.导入networkx,matplotlib包
    2.建立网络
    3.绘制网络 nx.draw()
    4.建立布局 pos = nx.spring_layout美化作用
    最基本画图程序

    1.  
      import import networkx as nx #导入networkx包
    2.  
      import matplotlib.pyplot as plt
    3.  
      G = nx.random_graphs.barabasi_albert_graph(100,1) #生成一个BA无标度网络G
    4.  
      nx.draw(G) #绘制网络G
    5.  
      plt.savefig("ba.png") #输出方式1: 将图像存为一个png格式的图片文件
    6.  
      plt.show() #输出方式2: 在窗口中显示这幅图像

    networkx 提供画图的函数有:

    1. draw(G,[pos,ax,hold])
    2. draw_networkx(G,[pos,with_labels])
    3. draw_networkx_nodes(G,pos,[nodelist]) 绘制网络G的节点图
    4. draw_networkx_edges(G,pos[edgelist]) 绘制网络G的边图
    5. draw_networkx_edge_labels(G, pos[, ...])绘制网络G的边图,边有label
      ---有layout 布局画图函数的分界线---
    6. draw_circular(G, **kwargs)Draw the graph G with a circular layout.
    7. draw_random(G, **kwargs)Draw the graph G with a random layout.
    8. draw_spectral(G, **kwargs)Draw the graph G with a spectral layout.
    9. draw_spring(G, **kwargs)Draw the graph G with a spring layout.
    10. draw_shell(G, **kwargs)Draw networkx graph with shell layout.
    11. draw_graphviz(G[, prog])Draw networkx graph with graphviz layout.

    networkx 画图参数:
    node_size: 指定节点的尺寸大小(默认是300,单位未知,就是上图中那么大的点)
    node_color: 指定节点的颜色 (默认是红色,可以用字符串简单标识颜色,例如'r'为红色,'b'为绿色等,具体可查看手册),用“数据字典”赋值的时候必须对字典取值(.values())后再赋值
    node_shape: 节点的形状(默认是圆形,用字符串'o'标识,具体可查看手册)
    alpha: 透明度 (默认是1.0,不透明,0为完全透明)
    width: 边的宽度 (默认为1.0)
    edge_color: 边的颜色(默认为黑色)
    style: 边的样式(默认为实现,可选: solid|dashed|dotted,dashdot)
    with_labels: 节点是否带标签(默认为True)
    font_size: 节点标签字体大小 (默认为12)
    font_color: 节点标签字体颜色(默认为黑色)
    e.g. nx.draw(G,node_size = 30, with_label = False)
    绘制节点的尺寸为30,不带标签的网络图。


    布局指定节点排列形式

    pos = nx.spring_layout
    

    建立布局,对图进行布局美化,networkx 提供的布局方式有:
    - circular_layout:节点在一个圆环上均匀分布
    - random_layout:节点随机分布
    - shell_layout:节点在同心圆上分布
    - spring_layout: 用Fruchterman-Reingold算法排列节点(这个算法我不了解,样子类似多中心放射状)
    - spectral_layout:根据图的拉普拉斯特征向量排列节
    布局也可用pos参数指定,例如,nx.draw(G, pos = spring_layout(G)) 这样指定了networkx上以中心放射状分布.

    绘制划分后的社区

    先看一段代码,代码源自site

    1.  
      partition = community.best_partition(User)
    2.  
      size = float(len(set(partition.values())))
    3.  
      pos = nx.spring_layout(G)
    4.  
      count = 0.
    5.  
       
    6.  
      for com in set(partition.values()) :
    7.  
      count = count + 1.
    8.  
      list_nodes = [nodes for nodes in partition.keys()
    9.  
      if partition[nodes] == com]
    10.  
      nx.draw_networkx_nodes(G, pos, list_nodes, node_size = 50,
    11.  
      node_color = str(count / size))
    12.  
       
    13.  
      nx.draw_networkx_edges(User,pos,with_labels = True, alpha=0.5 )
    14.  
      plt.show()
    15.  
       

    communit.best_partition 是社区划分方法,算法是根据Vincent D.Blondel 等人于2008提出,是基于modularity optimization的heuristic方法.
    partition的结果存在字典数据类型:
    {'1': 0, '3': 1, '2': 0, '5': 1, '4': 0, '6': 0}
    单引号里的数据是key,也就是网络中节点编号。
    冒号后面的数值,表示网络中节点的编号属于哪个社区。也就是社区标号。如'6': 0表示6节点属于0社区

    1.  
      list_nodes = [nodes for nodes in partition.keys()
    2.  
      if partition[nodes] == com]

    每次循环list_nodes结果是社区i对应的用户编号。
    如第一次循环结果是com = 0, list_nodes= ['1','2','4','6']
    第二次循环的结果是com = 1, list_nodes = ['3','6']
    这样每次循环,画出一个社区的所有节点:

    1.  
      nx.draw_networkx_nodes(G, pos, list_nodes, node_size = 50,
    2.  
      node_color = str(count / size))

    循环结束后通过颜色来标识不同社区。

    转自:https://segmentfault.com/a/1190000000527216

  • 相关阅读:
    倒排索引在MYSQL,PostgreSQL,ElasticSearch中的设计思想
    MySQL Group Replication: What Is It? Replicated Database State Machine & Paxos implementation
    Redis 6.0 docker Cluster
    What is the "Docker Subnet" used for?
    Windows MYSQL 8.0 或者 5.7 查找my.ini 修改端口号
    Kerberos Network Authentication Service Window & Mac
    协合新能源集团有限公司 | 红海 eHR BPMN
    基于 springBoot 实现webSocket方式的扫码登录
    Python中IO编程-StringIO和BytesIO
    Neo4j基本入门
  • 原文地址:https://www.cnblogs.com/IT-NXXB/p/13071154.html
Copyright © 2011-2022 走看看