网站百科推广怎么做,微信开发网站设计,网站的ftp帐号,深圳物流公司哪家便宜又好图的类型 Graph类是无向图的基类#xff0c;无向图能有自己的属性或参数#xff0c;不包含重边#xff0c;允许有回路#xff0c;节点可以是任何hash的python对象#xff0c;节点和边可以保存key/value属性对。该类的构造函数为Graph(dataNone#xff0c;**attr)#xf… 图的类型 Graph类是无向图的基类无向图能有自己的属性或参数不包含重边允许有回路节点可以是任何hash的python对象节点和边可以保存key/value属性对。该类的构造函数为Graph(dataNone**attr)其中data可以是边列表或任意一个Networkx的图对象默认为noneattr是关键字参数例如keyvalue对形式的属性。 MultiGraph是可以有重边的无向图其它和Graph类似。其构造函数MultiGraphdataNone, *attr。 DiGraph是有向图的基类有向图可以有数自己的属性或参数不包含重边允许有回路节点可以是任何hash的python对象边和节点可含key/value属性对。该类的构造函数DiGraph(dataNone,**attr)其中data可以是边列表或任意一个Networkx的图对象默认为noneattr是关键字参数例如keyvalue对形式的属性。 MultiDiGraph是可以有重边的有向图其它和DiGraph类似。其构造函数MultiDiGraphdataNone, *attr。 图的创建 import networkx as nx
Gnx.Graph() #创建了一个没有节点和边的空图 这里的图Graph是由一系列节点及节点对或者说边、链接组成。在Networx中节点可以是任何可以被hash的对象包括文本字符串、图片、XML对象、Graph和自定义的节点等。 图的节点 图可以以多种方式进行增长。Networkx提供多个图生成功能用于读写图。 一次增加一个节点 G.add_node(1) 通过包含节点的容器增加节点#可以是列表、字典、文件的某些行、其它图等 列表 G.add_nodes_from([2,3]) 其它图 G.add_nodes_from(H) #H is a graph object here 图的边 一次增加一条边G.add_edge(1,2) 通过包含边的容器增加 列表G.add_edges_from([(1,2),(1,3)]) 边集合G.add_edges_from(H.edges()) #H is also a graph here 属性 对于图边和节点都能将key/value对作为自己的属性保存在相关的dictionary中。该关联字典默认为空但是能通过add_edge,add_node或操作进行修改。 添加图的属性 Gnx.Graph(dayFriday) 添加节点的属性#主要的方法是add_node()和add_nodes_from() G.add_node(1,time5pm) #给节点1加属性对time:5pm
G.add_nodes_from([3], time2pm) #对前一个参数中的所有节点添加属性对time:2pm
G.node[1][room]714 #为G中的节点1添加属性对room:714 添加边的属性#主要方法是add_edge(),add_edges()和G.edge G.add_edge(1,2,weight4.7) #为1和2之间的边添加属性weight:4.7
G.add_edges_from([(3,4),(4,5)],colorred) #为连接3和4、4和5的边添加属性对color:red
G[1][2][weight]4.7
G.edge[1][2][weight]4 其它 len(G) #返回G中节点数目n in G #检查节点n是否在G中如在返回true。 相关函数 初始化Gnx.Graph() 图相关属性的函数 nx.degree(G)// 计算图的密度其值为边数m除以图中可能边数即n(n-1)/2 nx.degree_centrality(G)//节点度中心系数。通过节点的度表示节点在图中的重要性默认情况下会进行归一化其值表达为节点度d(u)除以n-1其中n-1就是归一化使用的常量。这里由于可能存在循环所以该值可能大于1. nx.closeness_centrality(G)//节点距离中心系数。通过距离来表示节点在图中的重要性一般是指节点到其他节点的平均路径的倒数这里还乘以了n-1。该值越大表示节点到其他节点的距离越近即中心性越高。 nx.betweenness_centrality(G)//节点介数中心系数。在无向图中该值表示为节点作占最短路径的个数除以((n-1)(n-2)/2)在有向图中该值表达为节点作占最短路径个数除以((n-1)(n-2))。 nx.transitivity(G)//图或网络的传递性。即图或网络中认识同一个节点的两个节点也可能认识双方计算公式为3*图中三角形的个数/三元组个数该三元组个数是有公共顶点的边对数这样就好数了。 nx.clustering(G)//图或网络中节点的聚类系数。计算公式为节点u的两个邻居节点间的边数除以((d(u)(d(u)-1)/2)。 ---------------------------------------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------------------------------------- 二、建立图或网络1、无向图在PythonWin 的Shell里输入import networkx as nx #导入NetworkX包为了少打几个字母将其重命名为nx
G nx.Graph() #建立一个空的无向图G
G.add_node(1) #添加一个节点1
G.add_edge(2,3) #添加一条边2-3隐含着添加了两个节点2、3
G.add_edge(3,2) #对于无向图边3-2与边2-3被认为是一条边
print G.nodes() #输出全部的节点 [1, 2, 3]
print G.edges() #输出全部的边[(2, 3)]
print G.number_of_edges() #输出边的数量1这样就可以建立一个简单的无向图了。如果你的数据是存在文件里的可以循环从文件中读取节点和边添加到G中。 2、有向图有向图的建立方式和无向图基本类似只是在上述代码的第二行将G nx.Graph() 改为 G nx.DiGraph() 。需要注意的是此时再添加边3-2与边2-3则被认为是两条不同的边可以试着运行上述代码自己查看结果。同时有向图和无向图是可以相互转化的分别用到Graph.to_undirected() 和 Graph.to_directed()两个方法。 3、加权图网络有向图和无向图都可以给边赋予权重用到的方法是add_weighted_edges_from它接受1个或多个三元组[u,v,w]作为参数其中u是起点v是终点w是权重。例如G.add_weighted_edges_from([(0,1,3.0),(1,2,7.5)])添加0-1和1-2两条边权重分别是3.0和7.5。如果想读取权重可以使用get_edge_data方法它接受两个参数u和v即边的起讫点。例如print G.get_edge_data(1,2) #输出{weight: 7.5}这是一个字典结构可以查看python语法了解它的用法。 三、调用图算法NetworkX 提供了常用的图论经典算法例如DFS、BFS、最短路、最小生成树、最大流等等非常丰富如果不做复杂网络只作图论方面的工作也可以应用 NetworkX作为基本的开发包。具体的算法调用方法我就不一一介绍了 可以浏览NX的在线手册http://networkx.lanl.gov /reference/algorithms.html 对每个算法都提供了详细的帮助文档和示例。 下面只给出一个最短路算法的例子pathnx.all_pairs_shortest_path(G) #调用多源最短路径算法计算图G所有节点间的最短路径
print path[0][2] #输出节点0、2之间的最短路径序列 [0, 1, 2] ---------------------------------------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------------------------------------- 三、网络可视化 科学可视化是利用计算机图形学来创建视觉图像帮助人们理解那些采取错综复杂而又往往规模庞大的数字呈现形式的科学概念或结果。对于复杂网络研究来说可视化技术同样重要它有助于呈现或解释复杂网络数据和模型进而从中发现或许是从数据中不易发现的各种模式、特点和关系。在我的另一篇博文《推荐一个复杂网络可视化的网站》中介绍了www.visualcomplexity.com这个网站上边有大量复杂网络和复杂系统的图片五彩缤纷令人叹为观止。有的朋友可能会想这些图形是否都是使用一些专业的平面设计软件制作的呢其实通过使用NetworkX我们同样可以制作出精美的复杂网络图形它提供了非常丰富的网络可视化功能。下边这幅动画就是用从NetworkX网站上下载的图片拼合而成的感兴趣的朋友可以到http://networkx.lanl.gov/gallery.html这个地址去查看生成这些图形的源代码。 在这篇笔记中我将简单地介绍使用NetworkX绘制复杂网络图形的基本方法。当然在这方面我也是初学只略懂一些皮毛希望能起到抛砖引玉的作用一、基本绘图流程在NetworkX中绘制一个网络使用nx.draw()方法它至少接受一个参数即你希望绘制的网络G。实际上这个方法非常复杂它可以指定20多个关键字参数后边会介绍一些常用的参数我们先从最简单的情况入手看看下边的例子import networkx as nx #导入networkx包
import matplotlib.pyplot as plt #导入绘图包matplotlib需要安装方法见第一篇笔记
G nx.random_graphs.barabasi_albert_graph(100,1) #生成一个BA无标度网络G
nx.draw(G) #绘制网络G
plt.savefig(ba.png) #输出方式1: 将图像存为一个png格式的图片文件
plt.show() #输出方式2: 在窗口中显示这幅图像运行上述代码的结果如下 这样用短短的几行代码就完成了一个最基本的网络图形绘制而且生成了一个功能丰富的窗体。窗口左下方的工具栏可以对图像进行放大、缩小、平移、保存等操作可以自己动手试一下。同时在源文件的目录下还生成了一个png格式的图片文件可以把它插入报告或论文中是不是很方便呢 二、运用样式上边的代码虽然简单但生成的图形略显单调。NetworkX提供了一系列样式参数可以用来修饰和美化图形达到我们想要的效果。常用的参数包括 - node_size: 指定节点的尺寸大小(默认是300单位未知就是上图中那么大的点) - node_color: 指定节点的颜色 (默认是红色可以用字符串简单标识颜色例如r为红色b为绿色等具体可查看手册) - node_shape: 节点的形状默认是圆形用字符串o标识具体可查看手册 - alpha: 透明度 (默认是1.0不透明0为完全透明) - width: 边的宽度 (默认为1.0) - edge_color: 边的颜色(默认为黑色) - style: 边的样式(默认为实现可选 solid|dashed|dotted,dashdot) - with_labels: 节点是否带标签默认为True - font_size: 节点标签字体大小 (默认为12) - font_color: 节点标签字体颜色默认为黑色灵活运用上述参数可以绘制不同样式的网络图形例如nx.draw(G,node_size 30,with_labels False) 是绘制节点尺寸为30、不带标签的网络图。 三、运用布局NetworkX在绘制网络图形方面提供了布局的功能可以指定节点排列的形式。这些布局包括circular_layout节点在一个圆环上均匀分布random_layout节点随机分布shell_layout节点在同心圆上分布spring_layout 用Fruchterman-Reingold算法排列节点这个算法我不了解样子类似多中心放射状spectral_layout根据图的拉普拉斯特征向量排列节点我也不是太明白布局用pos参数指定例如nx.draw(G,pos nx.circular_layout(G))。在上一篇笔记中四个不同的模型分别是用四种布局绘制的可以到那里去看一下效果此处就不再重复写代码了。另外也可以单独为图中的每个节点指定一个位置x、y坐标不过比较复杂我还没有这样做过。感兴趣的朋友可以看一下NetworkX文档中的一个例子http://networkx.lanl.gov/examples/drawing/knuth_miles.html。 四、添加文本用 plt.title()方法可以为图形添加一个标题该方法接受一个字符串作为参数fontsize参数用来指定标题的大小。例如plt.title(BA Networks, fontsize 20)。如果要在任意位置添加文本则可以采用plt.text()方法。事实上这些功能包括前边的图形保存等功能并不是由NetworkX提供的从包的名字上可以看出这些绘图函数都是由matplotlib这个包提供的。NetworkX只是把与复杂网络绘图相关的功能重新包装了一下让用户调用更方便而已。需要补充的一点是matplotlib并不直接支持中文文本如果想输出中文走正规方法还是挺麻烦的见http://blog.csdn.net/KongDong/archive/2009/07/10/4338826.aspx。不过有聪明的网友提出了一种偷梁换柱的解决方案换字体。只要把一个中文字体文件ttf文件更名为Vera.ttf拷贝到matplotlib的字体目录中覆盖原有文件就可以输出中文了具体细节见http://hi.baidu.com/ucherish/blog/item/63155e52b68c90070df3e3ff.html 。五、小结这篇笔记简单介绍了用NetworkX绘制复杂网络图形的方法实际上NetworkX的制图能力是很强的主要是matplotlib的功劳本文所介绍的功能只是其中最基础的一部分更多功能还有待我们一起去发掘。再次推荐 http://networkx.lanl.gov/gallery.html上的绘图示例代码能看懂弄清这些代码用NetworkX绘图应该就难不住你了转载于:https://www.cnblogs.com/gispathfinder/p/5790949.html