NetworkX

NetworkX

1. 安装NetworkX环境

1.1 略

import networkx as nx
nx.__version__
'2.7.1'

1.2 设置中文字体

import matplotlib.pyplot as plt
%matplotlib inline
plt.rcParams["font.sans-serif"]=["SimHei"]
plt.rcParams["axes.unicode_minus"]=False
plt.plot([1,2,3],[100,500,300])
plt.title("matplotlib中文字体",fontsize=25)
plt.xlabel("x轴",fontsize=15)
plt.ylabel("y轴",fontsize=15)
plt.show()

NetworkX_第1张图片

2. 创建图之NetworkX内置图

2.1 经典图结构

2.1.1 全连接无向图

G = nx.complete_graph(7)
nx.draw(G)

NetworkX_第2张图片

全图连接数

G.size()
21

2.1.2 全连接有向图

G = nx.complete_graph(7, nx.DiGraph())
nx.draw(G)

NetworkX_第3张图片

G.is_directed()
True

2.1.3 环状图

G = nx.cycle_graph(5)
nx.draw(G)

NetworkX_第4张图片

2.1.4 梯状图

G = nx.ladder_graph(5)
nx.draw(G)

NetworkX_第5张图片

2.1.5 线性串珠图

G = nx.path_graph(15)
nx.draw(G)

NetworkX_第6张图片

2.1.6 星状图

G = nx.star_graph(7)
nx.draw(G)

NetworkX_第7张图片

2.1.7 轮辐图

G = nx.wheel_graph(8)
nx.draw(G)

NetworkX_第8张图片

2.1.8 二项树

G = nx.binomial_tree(5)
nx.draw(G)

NetworkX_第9张图片

2.1.9 栅格图

2.1.9.1 二维矩形网格图
G = nx.grid_2d_graph(3, 5)
nx.draw(G)

NetworkX_第10张图片

2.1.9.2 二维矩形网格图
G = nx.grid_graph(dim=(2, 3, 4))
nx.draw(G)

NetworkX_第11张图片

2.1.9.3 二维三角形网格图
G = nx.triangular_lattice_graph(2, 5)
nx.draw(G)

NetworkX_第12张图片

2.1.9.4 二维六边形蜂窝图
G = nx.hexagonal_lattice_graph(2, 3)
nx.draw(G)

NetworkX_第13张图片

2.1.9.5 n维超立方体图
G = nx.hypercube_graph(4)
nx.draw(G)

NetworkX_第14张图片

2.1.10 NetworkX内置图

G = nx.diamond_graph()
nx.draw(G)
G = nx.bull_graph()
nx.draw(G)

NetworkX_第15张图片

G = nx.frucht_graph()
nx.draw(G)

NetworkX_第16张图片

G = nx.house_graph()
nx.draw(G)

NetworkX_第17张图片

G = nx.house_x_graph()
nx.draw(G)

NetworkX_第18张图片

G = nx.petersen_graph()
nx.draw(G)

NetworkX_第19张图片

G = nx.krackhardt_kite_graph()
nx.draw(G)

NetworkX_第20张图片

2.1.11 随机图

G = nx.erdos_renyi_graph(10, 0.5)
nx.draw(G)

NetworkX_第21张图片

2.1.12 无标度有向图

G = nx.scale_free_graph(100)
nx.draw(G)

NetworkX_第22张图片

2.1.13 社交网络

G = nx.karate_club_graph()
nx.draw(G, with_labels=True)

NetworkX_第23张图片

G.nodes[5]["club"]
'Mr. Hi'
G.nodes[9]["club"]
'Officer'

2.1.14 雨果-悲惨世界 人物关系

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

NetworkX_第24张图片

2.1.15 Florentine families graph

G = nx.florentine_families_graph()
nx.draw(G, with_labels=True)

NetworkX_第25张图片

2.1.16 社群聚类图

G = nx.caveman_graph(4, 3)
nx.draw(G, with_labels=True)

NetworkX_第26张图片

2.1.17 树

tree = nx.random_tree(n=10, seed=0)
print(nx.forest_str(tree, sources=[0]))
╙── 0
    ├── 3
    └── 4
        ├── 6
        │   ├── 1
        │   ├── 2
        │   └── 7
        │       └── 8
        │           └── 5
        └── 9

3.1 创建图

导入三元组连接表

import pandas as pd
df = pd.read_csv("sgyy/triples.csv")
df
head tail relation label
0 关羽 刘备 younger_sworn_brother 义弟
1 张飞 刘备 younger_sworn_brother 义弟
2 关羽 张飞 elder_sworn_brother 义兄
3 张苞 张飞 son 儿子
4 关兴 关羽 son 儿子
... ... ... ... ...
148 曹植 曹丕 younger_brother 弟弟
149 马谡 诸葛亮 colleague 同事
150 马谡 刘备 minister
151 孙坚 孙权 father 父亲
152 吴国太 孙权 mother 母亲

153 rows × 4 columns

通过连接表Edge List创建图

G = nx.DiGraph()
G.add_edges_from([*zip(df["head"], df["tail"])])
G.edges("关羽")
OutEdgeDataView([('关羽', '刘备'), ('关羽', '张飞')])

可视化

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

NetworkX_第27张图片

查看全图参数

print(G)
DiGraph with 123 nodes and 144 edges
len(G)
123
G.size()
144
G.nodes
NodeView(('关羽', '刘备', '张飞', '张苞', '关兴', '关平', '卢植', '公孙瓒', '甘氏', '刘禅', '诸葛瞻', '诸葛亮', '姜维', '黄月英', '黄承彦', '诸葛瑾', '公孙越', '马超', '马腾', '韩遂', '徐庶', '曹操', '刘胜', '刘启', '刘辩', '孙权', '孙尚香', '糜氏', '糜芳', '糜竺', '魏延', '赵云', '黄忠', '庞统', '法正', '蒋琬', '马良', '孟获', '沙摩柯', '庞德公', '马谡', '祝融', '孙韶', '孙策', '孙氏', '陆逊', '刘协', '董卓', '王允', '貂蝉', '吕布', '丁原', '高顺', '陈宫', '张辽', '刘表', '蔡氏', '蔡瑁', '蒯越', '黄祖', '文聘', '张宝', '张角', '张梁', '袁绍', '袁术', '袁谭', '袁熙', '袁尚', '吴国太', '孙坚', '大乔', '小乔', '周瑜', '丁奉', '徐盛', '鲁肃', '张昭', '蒋钦', '太史慈', '周泰', '凌统', '吕蒙', '甘宁', '黄盖', '韩当', '程普', '曹嵩', '吕伯奢', '邹氏', '张绣', '清河公主', '夏侯楙', '夏侯渊', '夏侯淳', '曹真', '曹爽', '郭嘉', '徐晃', '乐进', '张郃', '许褚', '典韦', '荀彧', '荀攸', '贾诩', '司马懿', '程昱', '于禁', '邓艾', '钟会', '庞德', '司马师', '司马昭', '司马炎', '曹仁', '曹纯', '曹昂', '刘氏', '超昂', '卞氏', '曹丕', '曹植'))

保存并载入邻接表Adjacency List

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=":")
plt.figure(figsize=(15, 14))
pos = nx.spring_layout(H, iterations=3, seed=5)
nx.draw(H, pos, with_labels=True)

NetworkX_第28张图片

创建节点

创建无节点,无连接的空图

G = nx.Graph()
G

G.nodes
NodeView(())
nx.draw(G)

NetworkX_第29张图片

添加单个节点

G.add_node("刘备")
G.nodes
NodeView(('刘备',))
G.add_node("Tomy")
G.nodes
NodeView(('刘备', 'Tomy'))
G.add_node(1)
G.nodes
NodeView(('刘备', 'Tomy', 1))

添加多个节点

G.add_nodes_from(["诸葛亮", "曹操"])
G.nodes
NodeView(('刘备', 'Tomy', 1, '诸葛亮', '曹操'))
G.add_nodes_from(range(100, 105))
G.nodes
NodeView(('刘备', 'Tomy', 1, '诸葛亮', '曹操', 100, 101, 102, 103, 104))

添加带属性特征的节点

G.add_nodes_from([
    ("关羽", {"武器": "青龙偃月刀", "武力值":90, "智力值":80}),
    ("张飞", {"武器": "丈八蛇矛", "武力值":85, "智力值":75}),
    ("吕布", {"武器": "方天画戟", "武力值":100, "智力值":70}),
])
G.nodes
NodeView(('刘备', 'Tomy', 1, '诸葛亮', '曹操', 100, 101, 102, 103, 104, '关羽', '张飞', '吕布'))
nx.draw(G)

NetworkX_第30张图片

创建另一个首尾相连成串的Path Graph

H = nx.path_graph(10)
nx.draw(H)

NetworkX_第31张图片

H.nodes
NodeView((0, 1, 2, 3, 4, 5, 6, 7, 8, 9))

将H的节点添加到G中

G.add_nodes_from(H)
G.nodes
NodeView(('刘备', 'Tomy', 1, '诸葛亮', '曹操', 100, 101, 102, 103, 104, '关羽', '张飞', '吕布', 0, 2, 3, 4, 5, 6, 7, 8, 9))
len(G)
22
nx.draw(G)

NetworkX_第32张图片

将H本身作为节点添加到G中

G.add_node(H)
G.nodes
NodeView(('刘备', 'Tomy', 1, '诸葛亮', '曹操', 100, 101, 102, 103, 104, '关羽', '张飞', '吕布', 0, 2, 3, 4, 5, 6, 7, 8, 9, ))
len(G)
23

节点为任意可哈希的对象

创建连接

G = nx.Graph()
G.is_directed()
False
G.graph["Name"] = "HelloWorld"
G.graph
{'Name': 'HelloWorld'}
H = nx.DiGraph()
H.is_directed()
True

创建单个节点

G.add_node(0, featues=5, label=0, gocara=2)
G.nodes[0]
{'featues': 5, 'label': 0, 'gocara': 2}

创建多个节点

G.add_nodes_from([
    (1, {"feature":1, "label":1, "gocara":3}),
    (2, {"feature":2, "label":2, "gocara":4}),
])

全图节点信息

G.number_of_nodes()
3
G.nodes
NodeView((0, 1, 2))
G.nodes(data=True)
NodeDataView({0: {'featues': 5, 'label': 0, 'gocara': 2}, 1: {'feature': 1, 'label': 1, 'gocara': 3}, 2: {'feature': 2, 'label': 2, 'gocara': 4}})
for node in G.nodes(data=True):
    print(node)
(0, {'featues': 5, 'label': 0, 'gocara': 2})
(1, {'feature': 1, 'label': 1, 'gocara': 3})
(2, {'feature': 2, 'label': 2, 'gocara': 4})

创建单个连接,设置属性特征

G.add_edge(0, 1, weight=0.5, like=3)

创建多个连接

G.add_edges_from([
    (1, 2, {"weight":0.3, "like":5}),
    (2, 0, {"weight":0.1, "like":8}),
])
G.edges[[0, 1]]
{'weight': 0.5, 'like': 3}
nx.draw(G, with_labels=True)

NetworkX_第33张图片

全图连接信息

G.number_of_edges()
3
G.size()
3
G.edges()
EdgeView([(0, 1), (0, 2), (1, 2)])
G.edges(data=True)
EdgeDataView([(0, 1, {'weight': 0.5, 'like': 3}), (0, 2, {'weight': 0.1, 'like': 8}), (1, 2, {'weight': 0.3, 'like': 5})])
for edge in G.edges(data=True):
    print(edge)
(0, 1, {'weight': 0.5, 'like': 3})
(0, 2, {'weight': 0.1, 'like': 8})
(1, 2, {'weight': 0.3, 'like': 5})

节点连接数(Node Degree)

node_id = 1
G.degree[node_id]
2
for neighbor in G.neighbors(node_id):
    print(f"Node {node_id} has neighbor {neighbor}")
Node 1 has neighbor 0
Node 1 has neighbor 2

4.1 可视化函数


你可能感兴趣的:(图论,神经网络,人工智能)