php 网站建设方案,网站代码需要注意什么问题吗,苏州建设工程信息网,品牌微信网站建设现在各种商业和开源的网络可视化的工具非常多#xff0c;NetworkX - NetworkX是一个非常重要的网络分析工具。当然它侧重于对网络结构的分析#xff0c;也包含了网络可视化部分。我最近由于要画一些张量网络图#xff0c;所以找到了这个工具。另一个值得推荐的是Latex中基于…现在各种商业和开源的网络可视化的工具非常多NetworkX - NetworkX是一个非常重要的网络分析工具。当然它侧重于对网络结构的分析也包含了网络可视化部分。我最近由于要画一些张量网络图所以找到了这个工具。另一个值得推荐的是Latex中基于tikz实现的hackl/tikz-network工具这个更侧重于画图效果非常漂亮。这里重点介绍NetworkX如何可视化。至于网络拓扑结构的分析专家可以仔细看相应文档我只是为了画图所以只用到关于图的最基本属性。本文共分三个部分分别是NetworkX中的基本对象节点和边NetworkX中的可视化函数存在的一些问题。NetworkX中的基本对象节点和边NetworkX主要是分析图的结果的因此可以创建的图的种类很多这里只利用Graph。在画图前首先要建立一个网络图代码如下。import networkx as nxG nx.Graph()这个时候的图是空的其中没有任何节点(node)和连接或者说是边(edge)。所以接下来要给G中添加一些节点和边。方法非常多我们介绍最基本的add_node和add_edge。G.add_node(1)G.add_edge(2,3)上面两段代码的意思分别是1行增加一个节点12行增加一条边从节点2到节点3由于没有手动添加节点2,3。程序会自己自动添加2和3。加入说要画四个原子形成的一维链那么完整的代码为import networkx as nxG nx.Graph()G.add_edge(1,2)G.add_edge(2,3)G.add_edge(3,4)如果这里不用1,2,3,4,标记用其它任何可hashable的对象都可以我这里只是画图就不说了。NetworkX中的可视化函数如果要把刚才的网络画出来那么直接调用draw函数即可代码和图如下import networkx as nxfrom pylab import showG nx.Graph()G.add_edge(1,2)G.add_edge(2,3)G.add_edge(3,4)nx.draw(G)show()在默认的情况下节点的位置是随机的因此画出来的图并不是一条链为了让确定的节点出现在特定的位置上有两种做法。这里由于只是画图我们利用draw中的pos参数修改代码如下。注意这里pos是一个字典key对应于节点的名字后面是节点的坐标。import networkx as nxfrom pylab import showG nx.Graph()G.add_edge(1,2)G.add_edge(2,3)G.add_edge(3,4)position{1:(1,0),2:(2,0),3:(3,0),4:(4,0)}nx.draw(G,posposition)show()除了可以控制节点的位置颜色大小形状等属性都可以任意设置比方下面的代码把上面的链条节点改成不同的颜色大小。import networkx as nxfrom pylab import showG nx.Graph()G.add_edge(1,2)G.add_edge(2,3)G.add_edge(3,4)position{1:(1,0),2:(2,0),3:(3,0),4:(4,0)}ncolor[r,b,k,g]nsize[600,400,200,100]nx.draw(G,posposition,node_colorncolor,node_shape,node_sizensize)show()还可以给每一个节点添加一个名字等等这些通过参数可以设定就不一一介绍了。如果我们只想画一些节点和一些边并不想让所有的节点出现那么可以通过nodelist这个参数控制。比方上面的图我们不想出现最后一个节点那么只需要把代码改为import networkx as nxfrom pylab import showG nx.Graph()G.add_edge(1,2)G.add_edge(2,3)G.add_edge(3,4)position{1:(1,0),2:(2,0),3:(3,0),4:(4,0)}ncolor[r,b,k,g]#nshape[o,d,,v]nsize[600,400,200,100]NL[1,2,3]nx.draw(G,nodelistNL,posposition,node_colorncolor,node_shape,node_sizensize)show()存在的一些问题如果仔细阅读NetworkX源代码会发现可视化的方法利用了matplotlib散点图的画法。比方说所有的节点都是用散点图函数scatter来实现的。因此它的使用受限于scatter的能力。并且在draw当中接口的参数并没有覆盖scatter接口中所有参数。比方scatter函数可以修改每一个marker的edgecolor但是在draw当中就没有。因此如果我们想实现一个facecolor为白色edgecolor为黑色的node就必须修改NetworkX的代码。而这一点恰好是我需要的因为你要给每个node标记一个名字的话显然白底黑边比较合适。再比如散点图本身默认的功能只能实现所有的marker形状是相同的因此在画散点图的时候要控制不同的点对应不同的marker需要使用mask函数过滤。例如Scatter Masked - Matplotlib 2.1.1 documentation。在NetworkX中也不能直接实现不过可以通过另外两个函数draw_networkx_nodes和draw_networkx_edges分别画节点和边。或者在Graph中添加node和edge的时候顺便加上相应的属性。