前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python社交网络——NetworkX入门

Python社交网络——NetworkX入门

作者头像
里克贝斯
发布2021-05-21 11:28:02
1.4K0
发布2021-05-21 11:28:02
举报
文章被收录于专栏:图灵技术域

特性

NetworkX是一个Python包,用于创建、操作和研究复杂网络的结构和功能。

  • 用于图、有向图和多重图的数据结构
  • 许多标准图数据算法
  • 网络结构和分析措施
  • 用于生成经典图、随机图和合成网络的生成器
  • 节点可以是“任何东西”(例如,文本、图像、XML记录)
  • 边可以容纳任意数据(例如,权重,时间序列)

无向图

Python

代码语言:javascript
复制
import networkx as nx
import matplotlib.pyplot as plt

# 无向图网络
G1 = nx.Graph()
G1.add_edge('A', 'B')
G1.add_edge('A', 'C')
G1.add_edge('A', 'D')
G1.add_edge('A', 'E')
G1.add_edge('B', 'C')
G1.add_edge('B', 'D')
G1.add_edge('B', 'E')
G1.add_edge('F', 'C')

nx.spring_layout(G1)
nx.draw_networkx(G1)
plt.show()
print('全部节点为:', G1.nodes())
print('全部边为:', G1.edges())
print('全部边数量:', G1.number_of_edges())

有向图

Python

代码语言:javascript
复制
# 有向图网络
G2 = nx.DiGraph()
G2.add_edge('A', 'B')
G2.add_edge('A', 'D')
G2.add_edge('C', 'A')
G2.add_edge('D', 'E')

nx.spring_layout(G2)
nx.draw_networkx(G2)
plt.show()

加权图

Python

代码语言:javascript
复制
# 加权图网络
G3 = nx.Graph()
G3.add_edge('A', 'B', weight=25)
G3.add_edge('A', 'C', weight=8)
G3.add_edge('A', 'D', weight=11)
G3.add_edge('A', 'E', weight=1)
G3.add_edge('B', 'C', weight=4)
G3.add_edge('B', 'D', weight=7)
G3.add_edge('B', 'E', weight=1)
G3.add_edge('E', 'C', weight=1)
nx.spring_layout(G3)
nx.draw_networkx(G3)
plt.show()

某一点到其他点的BFS图

代码语言:javascript
复制
T = nx.bfs_tree(G3, 'A')
nx.draw_networkx(T)
plt.show()

自带的Cycle图

Python

代码语言:javascript
复制
G4 = nx.cycle_graph(50)
pos = nx.spring_layout(G4, iterations=200)
nx.draw(G4, pos, node_color=range(50), node_size=500, font_weight='bold', with_labels=True)
plt.show()

其他属性

Python

代码语言:javascript
复制
print('G1中A的度数:', nx.degree(G1, 'A'))
print('G1中A的局部聚类系数:', nx.clustering(G1, 'A'))
print('G1中两个点的最短路径:', nx.shortest_path(G1, 'A', 'F'))
print('G3中两个点的最短路径长度:', nx.shortest_path_length(G3, 'D', 'E'))
print('G1的节点离心度:', nx.eccentricity(G1))

实例

Python

代码语言:javascript
复制
# 导入带权图
G = nx.Graph()
G.add_edges_from([('a', 'b', {'weight': 0.6}),
                  ('a', 'c', {'weight': 0.2}),
                  ('a', 'd', {'weight': 0.1}),
                  ('c', 'e', {'weight': 0.7})])
# 对不同权重进行处理,取得相应权重的点集列表,比如weight>0.5的点集列表为[('a', 'b'), ('c', 'e')]
elarge = [(u, v) for (u, v, d) in G.edges(data=True) if d['weight'] > 0.5]
esmall = [(u, v) for (u, v, d) in G.edges(data=True) if d['weight'] <= 0.5]
node1 = ['a', 'b']
node2 = ['c', 'd', 'e']
edge = {(u, v): d['weight'] for (u, v, d) in G.edges(data=True) if d['weight'] > 0.5}  # 加权处理
# 必须设定一个统一的布局,保证下面分步绘制的图的统一性,而且分步绘制时pos是一个必须参数
pos = nx.spring_layout(G)
# 分步绘制完整的图
# (1)绘制点,必须参数(G,pos),还可以指定点集(列表或optional)(默认全点集),形状,大小,透明度,等
nx.draw_networkx_nodes(G, pos=pos, nodelist=node1)  # > 0.5
nx.draw_networkx_nodes(G, pos=pos, nodelist=node2, node_shape='*', node_color='r', node_size=700)
# (2)绘制边,必须参数(G,pos, 还可以指定边集(边的元组集合(列表))(默认全边集),形状,大小,透明度,等
nx.draw_networkx_edges(G, pos=pos, edgelist=elarge)
nx.draw_networkx_edges(G, pos=pos, edgelist=esmall, edge_color='b', style='dashed', width=3)
# (3)绘制部分节点的标签,必须参数(G,pos),还可以指定点集(字典(值)或optional)(默认全点集),形状,大小,透明度,等
nx.draw_networkx_labels(G, pos=pos, labels={'a': 'a', 'b':'b', 'c': 'c', 'd': 'd', 'e': 'e'}, font_size=18, font_color='b', font_family='sans-serif')
# (4)绘制边的标签,必须参数(G,pos),还可以指定边集(字典:键是边的元组,值是边的某个属性值)(默认全边集),形状,大小,透明度,等
# 根据字典,通过键给边添加值的标签,{('a', 'b'): 0.6, ('c', 'e'): 0.7}
nx.draw_networkx_edge_labels(G, pos=pos, edge_labels=edge, font_size=7, font_color='black', font_family='sans-serif')
# 显示
plt.axis('off')
plt.show()

实例来自:https://www.cnblogs.com/yu-liang/p/9117643.html

所有代码

Python

代码语言:javascript
复制
import networkx as nx
import matplotlib.pyplot as plt

# 无向图网络
G1 = nx.Graph()
G1.add_edge('A', 'B')
G1.add_edge('A', 'C')
G1.add_edge('A', 'D')
G1.add_edge('A', 'E')
G1.add_edge('B', 'C')
G1.add_edge('B', 'D')
G1.add_edge('B', 'E')
G1.add_edge('F', 'C')

nx.spring_layout(G1)
nx.draw_networkx(G1)
plt.show()
print('全部节点为:', G1.nodes())
print('全部边为:', G1.edges())
print('全部边数量:', G1.number_of_edges())


# 有向图网络
G2 = nx.DiGraph()
G2.add_edge('A', 'B')
G2.add_edge('A', 'D')
G2.add_edge('C', 'A')
G2.add_edge('D', 'E')

nx.spring_layout(G2)
nx.draw_networkx(G2)
plt.show()


# 加权图网络
G3 = nx.Graph()
G3.add_edge('A', 'B', weight=25)
G3.add_edge('A', 'C', weight=8)
G3.add_edge('A', 'D', weight=11)
G3.add_edge('A', 'E', weight=1)
G3.add_edge('B', 'C', weight=4)
G3.add_edge('B', 'D', weight=7)
G3.add_edge('B', 'E', weight=1)
G3.add_edge('E', 'C', weight=1)
nx.spring_layout(G3)
nx.draw_networkx(G3)
plt.show()

# 某一点到其他点的BFS图
T = nx.bfs_tree(G3, 'A')
nx.draw_networkx(T)
plt.show()


# 自带的Cycle图
G4 = nx.cycle_graph(50)
pos = nx.spring_layout(G4, iterations=200)
nx.draw(G4, pos, node_color=range(50), node_size=500, font_weight='bold', with_labels=True)
plt.show()

print('G1中A的度数:', nx.degree(G1, 'A'))
print('G1中A的局部聚类系数:', nx.clustering(G1, 'A'))
print('G1中两个点的最短路径:', nx.shortest_path(G1, 'A', 'F'))
print('G3中两个点的最短路径长度:', nx.shortest_path_length(G3, 'D', 'E'))
print('G1的节点离心度:', nx.eccentricity(G1))


# 导入带权图
G = nx.Graph()
G.add_edges_from([('a', 'b', {'weight': 0.6}),
                  ('a', 'c', {'weight': 0.2}),
                  ('a', 'd', {'weight': 0.1}),
                  ('c', 'e', {'weight': 0.7})])
# 对不同权重进行处理,取得相应权重的点集列表,比如weight>0.5的点集列表为[('a', 'b'), ('c', 'e')]
elarge = [(u, v) for (u, v, d) in G.edges(data=True) if d['weight'] > 0.5]
esmall = [(u, v) for (u, v, d) in G.edges(data=True) if d['weight'] <= 0.5]
node1 = ['a', 'b']
node2 = ['c', 'd', 'e']
edge = {(u, v): d['weight'] for (u, v, d) in G.edges(data=True) if d['weight'] > 0.5}  # 加权处理
# 必须设定一个统一的布局,保证下面分步绘制的图的统一性,而且分步绘制时pos是一个必须参数
pos = nx.spring_layout(G)
# 分步绘制完整的图
# (1)绘制点,必须参数(G,pos),还可以指定点集(列表或optional)(默认全点集),形状,大小,透明度,等
nx.draw_networkx_nodes(G, pos=pos, nodelist=node1)  # > 0.5
nx.draw_networkx_nodes(G, pos=pos, nodelist=node2, node_shape='*', node_color='r', node_size=700)
# (2)绘制边,必须参数(G,pos, 还可以指定边集(边的元组集合(列表))(默认全边集),形状,大小,透明度,等
nx.draw_networkx_edges(G, pos=pos, edgelist=elarge)
nx.draw_networkx_edges(G, pos=pos, edgelist=esmall, edge_color='b', style='dashed', width=3)
# (3)绘制部分节点的标签,必须参数(G,pos),还可以指定点集(字典(值)或optional)(默认全点集),形状,大小,透明度,等
nx.draw_networkx_labels(G, pos=pos, labels={'a': 'a', 'b':'b', 'c': 'c', 'd': 'd', 'e': 'e'}, font_size=18, font_color='b', font_family='sans-serif')
# (4)绘制边的标签,必须参数(G,pos),还可以指定边集(字典:键是边的元组,值是边的某个属性值)(默认全边集),形状,大小,透明度,等
# 根据字典,通过键给边添加值的标签,{('a', 'b'): 0.6, ('c', 'e'): 0.7}
nx.draw_networkx_edge_labels(G, pos=pos, edge_labels=edge, font_size=7, font_color='black', font_family='sans-serif')
# 显示
plt.axis('off')
plt.show()

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-01-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 特性
  • 无向图
  • 有向图
  • 加权图
  • 某一点到其他点的BFS图
  • 自带的Cycle图
  • 其他属性
  • 实例
  • 所有代码
相关产品与服务
图数据库 KonisGraph
图数据库 KonisGraph(TencentDB for KonisGraph)是一种云端图数据库服务,基于腾讯在海量图数据上的实践经验,提供一站式海量图数据存储、管理、实时查询、计算、可视化分析能力;KonisGraph 支持属性图模型和 TinkerPop Gremlin 查询语言,能够帮助用户快速完成对图数据的建模、查询和可视化分析。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档