004NetworkX功能简介与思路启发


零. 前言

  1. 在生成模型方兴未艾之际,借助AI编写代码已经成为不错的选项,我们可以抽出更多的时间用于学习新事物,因此本章只对 NetworkX 进行功能简介与思路启发。不止如此,后续博客也会继承这一想法。
  2. 安装相关程序包是使用的前提。
  3. 为后续展示方便,不妨将 matplotlib 设置成允许中文显示。
  4. 想了解 NetworkX 某个函数的功能,可以通过加问号的方式获取帮助。
nx.pagerank? # 获取帮助
nx.pagerank?? # 获取源码

一. 创建 NetworkX 的内置图

  • 简单结构图。如:全连接无向图、全连接有向图、环形图、树结构图等。
  • 社交网络图。如:空手道俱乐部图( nx.karate_club_graph() )、《悲惨世界》人物关系图等。
  • 代码举例:
import networkx as nx
import matplotlib.pyplot as plt

G = nx.karate_club_graph()

print(G.nodes[5]['club']) # 查看节点的属性特征

plt.figure(figsize=(12,10)) # 创建一个新的图形窗口,并设置其大小为宽度为12英寸、高度为10英寸
pos = nx.spring_layout(G, seed=10) # 生成节点布局,此处用弹性布局,也可以指定节点坐标
nx.draw(G, pos=pos, with_labels=True)
plt.show()
import networkx as nx
import matplotlib.pyplot as plt

tree = nx.random_tree(n=10,seed=0)

print(nx.forest_str(tree, sources=[0]))

nx.draw(tree)
plt.show()

二. 通过连接表和邻接表创建图

  • 可以通过导入三元组连接表构建图。
  • 也可以把图保存成邻接表,再读取。
  • 代码举例:
import pandas as pd
import networkx as nx
import matplotlib.pyplot as plt

df = pd.read_csv('T1.csv') # 导入三元组连接表,用于构建有向图

G = nx.DiGraph() # 构建空的有向图

# 根据三元组连接表添加节点与连接
edges = [edge for edge in zip(df['head'], df['tail'])]
G.add_edges_from(edges)

print(G.edges('shen')) # 查看节点的全部连接

pos = nx.spring_layout(G, seed=10)
plt.figure(figsize=(15,15))
nx.draw(G, pos, with_labels=True)
plt.show()

# 展示邻接表
for line in nx.generate_adjlist(G):
    print(line)

# 保存邻接表
nx.write_edgelist(G, path='grid.edgelist', delimiter=':')

# 读取邻接表
H = nx.read_edgelist(path='grid.edgelist', delimiter=':')

print(H)

三. 从零开始创建图

  • 任何可哈希的对象都可以作为图的节点。如:图、文件、字符串。
  • 代码举例:
import networkx as nx
import matplotlib.pyplot as plt

G = nx.Graph() # 创建空无向图

# 给图添加属性特征
G.graph['name'] = 'HelloWorld'

"""添加节点"""
# 逐个添加节点
G.add_node('chen')
G.add_node('shen')
G.add_node(1)
G.add_node(0,fea1=5, fea2=10)

# 批量添加节点
G.add_nodes_from(['yang', 'zhao'])
G.add_nodes_from(range(100,105))

# 批量添加带属性特征的节点
G.add_nodes_from([
    ('sun',{
    
    'id':154004,'class':'002'}),
    ('zhang',{
    
    'id':157004,'class':'001'}),
    ('li',{
    
    'id':157984,'class':'004'})
])

# 创建一个新图,把新图的各节点与新图本身加到旧图里
H = nx.path_graph(10)
G.add_nodes_from(H) # 注:同名节点会被合并
G.add_node(H) # 把图当成一个节点传入

"""添加连接"""
G.add_edge(1, 'chen', weight=0.5)
G.add_edges_from([
    ('chen', 'shen', {
    
    'weight':0.8}),
    (0, 101, {
    
    'weight':0.9})
])

print(G.graph)
print(G.nodes)
print(G.nodes(data=True))
print(G.nodes[0])
print(G.nodes['li']['id'])
print(G.edges[[0,101]])
print(G.degree[101])
print(G.neighbors('chen'))

nx.draw(G, with_labels=True)
plt.show()

四. nx.draw() 可视化定制

  • 使用 nx.draw() 可以绘制不同风格的图。
  • 它可以设置节点尺寸、节点颜色、节点轮廓颜色、节点坐标、连接颜色、链接粗细、箭头尺寸、是否显示节点标签等。
  • 可以逐个指定,也可以用字典指定。
  • 可以通过分批次绘制节点、边来实现更为丰富的绘图风格。
nx.draw_networkx_nodes(G, pos, node_size=30, nodelist=['chen',1,101,'zhao'], node_color='blue')
nx.draw_networkx_nodes(G, pos, node_size=15, nodelist=['yang'], node_color='red')
nx.draw_networkx_edges(G, pos, alpha=0.5, width=6)
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=list(measures.values()),
                                   nodelist=measures.keys())
    nodes.set_norm(mcolors.SymLogNorm(linthresh=0.01,linscale=1,base=10))
    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, seed=10)
draw(G, pos, nx.betweenness_centrality(G), 'Node Degree')
draw(G, pos, dict(G.degree), 'Node Degree')

五. 其它图

  • 多路连接图:G = nx.from_pandas_edgelist(df, ‘White’, Black’, edge_attr=True, create_using=nx.MultiDiGraph())
  • 自我中心图(Ego图):找出连接数最大的主节点,构建以它为中心的邻域子图。
  • 自定义节点图标的图

六. 常见的对图操作

  • 以下操作可以用 print 打印,基本上也都可以用for循环遍历:
  • 判断是否为有向图:G.is_directed()
  • 查看图的节点数与连接数:G
  • 查看图的节点数:G.number_of_nodes()
  • 查看全图连接数:G.number_of_edges()
  • 查看所有的节点:G.nodes
  • 查看所有的节点及其属性特征:G.nodes(data=True)
  • 查看所有的边:G.edges
  • 查看所有的边及其属性特征:G.edges(data=True)
  • 查看图的属性特征:G.graph
  • 查看节点属性特征:G.nodes[节点名/编号]
  • 查看节点属性特征值:G.nodes[节点名/编号][特征名]
  • 查看节点的所有连接:G.edges(节点名)
  • 查看连接特征:G.edges[[节点对]]
  • 查看节点的度:G.degree[节点名]
  • 查看节点的相邻节点:G.neighbors(节点名) ,返回一个字典。

猜你喜欢

转载自blog.csdn.net/qq_44928822/article/details/132718449
004
今日推荐