这几天在用networkx,官方文档是这个,很全也很详细,这里简单记录一些简单的用法和使用过程中的菜鸡看法。

这篇主要记一下networkx基本图创建和如何画图。

环境
Python 3.6.3
networkx 2.4
matplotlib 2.1.0

图的创建

这里主要介绍一下networkx中定义的图结构,以及以无向图为例的用法。

图的类型

networkx中规定了四种图:无向图、有向图、多重无向图、多重有向图,所有图允许出现自环。

区别:

名称 方向 多重边
Graph 无向
DiGraph 有向
MultiGraph 无向
MultiDiGraph 无向

我的实验中用Graph类型的比较多,所以这里先介绍一下无向图Graph的用法。

在networkx里面,图的点、边的都是xxView这样一个结构,有的时候需要转换一下才能直接读取(具体是个什么我也不知道,但是看起来像个字典,我也是这么理解的)

新建无向图

import networkx
# 新建一个空的无向图G
G = nx.Graph()

加入节点

# 一次加入一个结点
G.add_node(0)
# 从列表中加入节点
G.add_nodes_from([1,2])
# 从另一个图H中合并,path_graph(n)表示生成一个n个结点的路径图
H = nx.path_graph(10)
G.add_nodes_from(H)

以第三种方式加入结点时,H可以作为G的一个结点使用。

加入边

# 一次加入一条边
G.add_edge(1,2)
# 从列表中加入边,注意括号
G.add_edges_from([(1,2),(2,3)])
# 从另一个图H中合并
G.add_edges_from(H.edges)

删除

G.remove_node(1)
G.remove_nodes_from([2,3])
G.remove_edge(5,6)
G.remove_edges_from([(7,8),(8,9)])

删除点边和加入点边操作类似,需要注意的是删除一个点时会删除与之连接的所有边。

查看图

# 查看是否有点1
G.has_node(1)
# 查看是否有边(1,2)
G.has_edge(1,2)
# 查看点的数量
G.order()
G.number_of_nodes()
# 查看边的数量
G.size()
G.number_of_edges()
# 查看所有点
list(G.nodes())
# 查看所有边
list(G.edges())
# 查看图中点1的度
list(G.degree[1])
# 查看图中点1的邻居节点
list(G.adj[1])
list(G[1])

查找邻居节点还有一种是返回一个迭代器,返回格式是:(当前节点,{邻居节点:{属性}},一般在后面有循环的时候用。

# 查看点1的邻居节点
nb = G.neighbors(1)
for i in nb:print(i)
# 查看所有点的邻居节点
nb_all = G.adjacency()
for i in nb_all:print(i)

添加属性

添加图的属性

# 引用官方文档例子
# 新建一个图,并添加属性
G = nx.Graph(day="Friday")
# 对已有的图添加属性
G.graph['day'] = "Monday"

添加点的属性

# 新建点时添加权重
G.add_node(1, weight = '10')
# 对已有点添加权重
G.nodes[1][['weight'] = 10

添加边的属性

# 假设给边加入权重
G.add_edge(1,2,weight = '10')
G.add_edges_from([(1,2,{'weight':10}),(2,3,{'weight':15})])
G.add_edges_from([(1,2),(1,3)],weight = '10')
G[1][2]['weight'] = 10
G.edges[1,2]['weight'] = 10

前三种是添加边时添加权重,后两种是对已有的边添加权重,用的时候没发现什么区别。当然除了权weight还可以添加其他属性,比如颜色、距离等,上面的属性都可以是任意数据类型。

无向图的基础内容大概就是这些。

有向图——DiGraph

相比较无向图,有向图多了一个方向,并且在边的存储上多了一个predecessor和successor的区别,因此也可以通过G.in_degree(n)和G.out_degree(n)来查询入度和出度,并且G.degree(n)为两者之和。

并且对于一个有向图DG,可以通过DG.to_undirected()和nx.Graph(DG),使其变为无向图。

# 新建一个空的有向图DG
DG = nx.DiGraph()
# 添加的用法和无向图一样
# 添加边的时候注意方向
DG.add_node(0)
DG.add_nodes_from([1,2])
H = nx.path_graph(10)
DG.add_nodes_from(H)

多重无向图——MutiGraph

暂时还没用到,占坑之后填,(咕咕咕

多重有向图——MutiDiGraph

(咕咕咕

图的绘制

创建完一个图就可以开始画图了。

首先导个包,然后生成一个图:

import matplotlib.pyplot as plt
# 生成一个G(n,p)图,表示n个点,两个点之间是否连接互相独立,并且概率为p
G = nx.fast_gnp_random_graph(10,0.5)

首先直接画图:

nx.draw(G)
plt.show()

画出来的图长这样:
如果觉得点这样分布不好看,可以用pos这个位置参数来调整,pos是一个二维数组,每组数据对应一个点的坐标。

networkx里自带的常用分布有:

circular_layout(G[, scale, center, dim]):点分布在一个圆上
random_layout(G[, center, dim, seed]):随机分布
rescale_layout(pos[, scale]):重新在(-scale,scale)范围内分布
shell_layout(G[, nlist, scale, center, dim]):同心圆上分布
spring_layout(G[, k, pos, fixed, …]):Position nodes using Fruchterman-Reingold force-directed algorithm.(不知道什么算法求得的分布,故放上原文)
spectral_layout(G[, weight, scale, center, dim]):用拉普拉斯矩阵的特征向量分布

比如下面是用自带的circular_layout画出来的图:

pos = nx.circular_layout(G)
nx.draw(G,pos,with_labels = True,node_color = 'pink',node_size = 200)
plt.show()

这里稍微设置了一下标号显示、点的颜色和大小。

进阶版画图

有时候我们画一个图,比如在着色问题中想规定一些不同的结点颜色,每次只想画这个图中的部分结点或者部分边,这种时候,就需要用到下面的方法了:

# 画点
draw_networkx_nodes(G, pos, nodelist=None, node_size=300, node_color='#1f78b4', node_shape='o', alpha=None,cmap=None, vmin=None, vmax=None, ax=None, linewidths=None, edgecolors=None, label=None, **kwds)
# 画边
draw_networkx_edges(G, pos, edgelist=None, width=1.0, edge_color='k', style='solid', alpha=None, arrowstyle='-|>', arrowsize=10, edge_cmap=None, edge_vmin=None, edge_vmax=None, ax=None, arrows=True, label=None, node_size=300, nodelist=None, node_shape='o', connectionstyle=None, min_source_margin=0, min_target_margin=0, **kwds)
# 标签
draw_networkx_labels(G, pos, labels=None, font_size=12, font_color='k', font_family='sans-serif', font_weight='normal', alpha=None, bbox=None, ax=None, **kwds)
# 边的标签
draw_networkx_edge_labels(G, pos, edge_labels=None, label_pos=0.5, font_size=10, font_color='k', font_family='sans-serif', font_weight='normal', alpha=None, bbox=None, ax=None, rotate=True, **kwds)

这些里面一定要有的参数是G和pos,alpha是透明度,cmap是颜色映射,其他的按需画图就行。

先写到这里8,例子下次再加(咕咕咕

networkx —— 基本操作及画图相关推荐

  1. 呆萌的图模型学习——图基本信息 Networkx基本操作(二)

    Networkx是python常用的处理图模型的工具包,可以方便的处理图模型: Github项目主页:https://github.com/networkx/networkx 官网基本教程:https ...

  2. networkx使用Graphviz画图要点

    本文涉及的工具 Graphviz(官网) Pygraphviz(安装Pygraphviz的正确姿势) networkx(pip install networkx) import networkx as ...

  3. Pandas的基本操作以及画图

    1.读取文件操作 读取文件 data = pd.read_csv('./data/stock_day.csv') 删除一些列,让数据更简单些,再去做后面的操作 data = data.drop([&q ...

  4. Python OpenCV _1基本操作(画图,循环播放图像,鼠标事件,读取中文路径中的图片)

    此系列源码在我的GitHub里:https://github.com/yeyujujishou19/Python-OpenCV 一,OpenCV的结构 A)根据功能和需求的不同,OpenCV中的函数接 ...

  5. 呆萌的图模型学习——使用networkx计算node2vec,得到节点与边的embedding(三)

    networkx基本操作请参考:[呆萌的图模型学习--图基本信息 & Networkx基本操作(二)](呆萌的图模型学习--图基本信息 & Networkx基本操作(二)) node2 ...

  6. 数据挖掘-matplotlib、numpy、pandas(二)

    文章目录 Numpy Pandas Numpy # 数值化计算库import numpy as np score=np.array([[80,81,82,83,84],[78,96,95,94,93] ...

  7. python学习与数据挖掘_Python学习之数据挖掘(三)

    Pandas 基础处理 Pandas是什么?为什么用? 核心数据结构 DataFrame Panel Series 基本操作 运算 画图 文件的读取与存储 高级处理 4.1Pandas介绍 4.1.1 ...

  8. 八、Pandas的基本使用

    Pandas的基本使用 点击标题即可获取文章源代码和笔记 4.1.0 概要 Pandas基础处理Pandas是什么?为什么用?核心数据结构DataFramePanelSeries基本操作运算画图文件的 ...

  9. 计算机基础教学质量分析报告,张丹菲信息技术质量分析报告1

    <张丹菲信息技术质量分析报告1>由会员分享,可在线阅读,更多相关<张丹菲信息技术质量分析报告1(4页珍藏版)>请在人人文库网上搜索. 1.信息技术学科质量分析报告一.试题指导思 ...

最新文章

  1. 让AI说话告别三观不正,OpenAI只用80个文本就做到了
  2. 举例说明信息熵、互信息的计算过程
  3. mysql format不要逗号,mysql格式化小数
  4. Java笔试题解答和部分面试题
  5. linux系统5.5安装教程,图解安装Debian 9.5全过程
  6. 一文带你探究Sentinel的独特初始化
  7. 2017.9.13 序列维护 思考记录
  8. 每个日期新用户的次日留存率
  9. Mac版MySQL安装和登陆
  10. AI戒毒?没错,北京开始这么干了
  11. 重置PL/SQL Developer工具栏布局
  12. 职场这样发邮件,你死定了!
  13. R语言从入门到精通Day2之【R语言软件下载与安装】
  14. 计算机硬盘分区重置,重置计算机磁盘分区后如何恢复丢失的数据
  15. Vue-basic 19.单文件组件
  16. 【隧道应用-3】Cobalt Strike正向连接多层内网
  17. 网站使用手机相机_使用“互通相机”把你的iPhone手机变成Mac的心灵之窗!
  18. 收集需求的方法:群体创新技术
  19. 科技论文的分类及写作
  20. alex机器人 ser_机器人抓取时怎么定位的?用什么传感器来检测?

热门文章

  1. 【C#】winform软件UI设计模板
  2. 线性代数:通过向量组个数和维数判别向量组线性相关性
  3. 亥姆霍兹线圈分类简介
  4. 微服务与微服务架构的主要思想和原则
  5. 共模电感(扼流圈) 差模电感(扼流圈)
  6. MMU的作用及工作过程
  7. 2010 我的求职经历(1)
  8. LAMP--系统、平台、数据库和程序
  9. dpdk环境搭建+创建dpdk项目,并连接dpdk库
  10. VPP使用详解——基于VPP的VLAN配置