import networkx as nx
nx.__version__
'2.7.1'
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()
G = nx.complete_graph(7)
nx.draw(G)
全图连接数
G.size()
21
G = nx.complete_graph(7, nx.DiGraph())
nx.draw(G)
G.is_directed()
True
G = nx.cycle_graph(5)
nx.draw(G)
G = nx.ladder_graph(5)
nx.draw(G)
G = nx.path_graph(15)
nx.draw(G)
G = nx.star_graph(7)
nx.draw(G)
G = nx.wheel_graph(8)
nx.draw(G)
G = nx.binomial_tree(5)
nx.draw(G)
G = nx.grid_2d_graph(3, 5)
nx.draw(G)
G = nx.grid_graph(dim=(2, 3, 4))
nx.draw(G)
G = nx.triangular_lattice_graph(2, 5)
nx.draw(G)
G = nx.hexagonal_lattice_graph(2, 3)
nx.draw(G)
G = nx.hypercube_graph(4)
nx.draw(G)
G = nx.diamond_graph()
nx.draw(G)
G = nx.bull_graph()
nx.draw(G)
G = nx.frucht_graph()
nx.draw(G)
G = nx.house_graph()
nx.draw(G)
G = nx.house_x_graph()
nx.draw(G)
G = nx.petersen_graph()
nx.draw(G)
G = nx.krackhardt_kite_graph()
nx.draw(G)
G = nx.erdos_renyi_graph(10, 0.5)
nx.draw(G)
G = nx.scale_free_graph(100)
nx.draw(G)
G = nx.karate_club_graph()
nx.draw(G, with_labels=True)
G.nodes[5]["club"]
'Mr. Hi'
G.nodes[9]["club"]
'Officer'
G = nx.les_miserables_graph()
plt.figure(figsize=(12, 10))
pos = nx.spring_layout(G, seed=10)
nx.draw(G, pos, with_labels=True)
G = nx.florentine_families_graph()
nx.draw(G, with_labels=True)
G = nx.caveman_graph(4, 3)
nx.draw(G, with_labels=True)
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)
查看全图参数
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)
创建节点
创建无节点,无连接的空图
G = nx.Graph()
G
G.nodes
NodeView(())
nx.draw(G)
添加单个节点
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)
创建另一个首尾相连成串的Path Graph
H = nx.path_graph(10)
nx.draw(H)
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)
将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)
全图连接信息
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