networkx之图遍历和图绘制

networkx之图遍历和图绘制networkx之图遍历和图绘制文章目录networkx之图遍历和图绘制图数据读取后默认标签(labels)为索引,如何使用编号id?图数据读取后,如何得到节点集和边集?如何绘制多样的图?图数据读取后默认标签(labels)为索引,如何使用编号id?例如在读取football数据时,其labels都是节点的英文名称,这样在处理图数据时不是很方便,往往报错,我们通常习惯处理节点的编号从1开始,可以建立label-id的反向索引,如果处理图数据时只需要编号id,可以将labels属性设置为id,如果之后还

大家好,又见面了,我是你们的朋友全栈君。

networkx之图遍历和图绘制

图数据读取后默认标签(labels)为索引,如何使用编号id?

例如在读取football数据时,其labels都是节点的英文名称,这样在处理图数据时不是很方便,往往报错,我们通常习惯处理节点的编号从1开始,可以建立label-id的反向索引,如果处理图数据时只需要编号id,可以将labels属性设置为id,如果之后还需要查询,可返回反向索引字典

处理函数如下:

def swap_id_label(G):
    """ 建立id和label的反向索引 return: new_graph :rtype: object """
    nodes = []
    edges = []
    nodes_id = dict()
    nodes_label = dict()
    for id, label in enumerate(G.nodes()):
        nodes_id[label] = id + 1
        nodes_label[id + 1] = label
        nodes.append(id + 1)
    for (u, v) in G.edges():
        edges.append((nodes_id[u], nodes_id[v]))
    new_graph = nx.Graph()
    new_graph.add_nodes_from(nodes)
    for node in nodes:
        new_graph.add_node(node, labels = node)
    new_graph.add_edges_from(edges)
    return new_graph

参考博客:【Python】networkx读取gml图文件,有两个问题影响使用


图数据读取后,如何得到节点集和边集?

在图数据读取后,我们在算法中处理数据时往往会对图的节点集和边集进行处理,下面提供几种遍历方式:

  • G.edges():返回的是列表,列表中为边连接二元组(u, v)

    G = nx.karate_club_graph()
    print(G.edges())
    for edge in G.edges():
        ···
    
  • G.nodesG.nodes()返回值一样,均是节点集列表

  • 遍历id、labels

    for id, label in enumerate(G.nodes()):
        print("id, label-> ", id , ":", label)
    
  • 读取节点属性

    for node in G.nodes:
        print('---> ', G.nodes[node])
        print('---| ', G.nodes[node]['value'])
        print('---< ', G._node[node]['labels'])
    

如何绘制多样的图?

在绘制图时,有时我们可能需要为节点着不同的颜色,展示不同属性和大小等等,需要为边添加不同的线型,颜色、粗细等等,这时需要分步绘制,其各类属性如下:

# 画点
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)

属性参考博客链接:networkx —— 基本操作及画图

?

下面以karate_club数据集为例绘制图:

import networkx as nx
import matplotlib.pyplot as plt

G = nx.karate_club_graph()

pos = nx.spring_layout(G) # 节点的布局为spring型
plt.figure(figsize = (6, 6)) # 图片大小

nodes = list(G.nodes())
vn = len(nodes)
nodes1 = [nodes[i] for i in range(0, (int)(vn / 2))]
nodes2 = [nodes[i] for i in range((int)(vn / 2), vn)]
nx.draw_networkx_nodes(G, pos = pos, nodelist=nodes1, node_color='r', node_size=140)
nx.draw_networkx_nodes(G, pos = pos, nodelist=nodes2, node_color='y', node_size=80)

edges = list(G.edges())
en = len(edges)
edges1 = [edges[i] for i in range(0, (int)(en / 2))]
edges2 = [edges[i] for i in range((int)(vn / 2), en)]
nx.draw_networkx_edges(G, pos = pos, edgelist=edges1, style='dashed', edge_color='g', width=1.0 , alpha='0.6')
nx.draw_networkx_edges(G, pos = pos, edgelist=edges2, style='dashed', edge_color='b', width=1.0 )

plt.show()

绘制结果如下

在这里插入图片描述


详细networkx使用见官网https://networkx.org/
官方文档已上传至资源☞☞☞传送门networkx.pdf

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/141886.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • MBus总线的基础学习

    MBus总线的基础学习MBus总线是一种主从式半双工传输总线,采用主叫/应答的方式通信,即只有处于中心地位的主站(Master)发出询问后,从站(Slave)才能向主站传输数据。MBus的主要特点如下:1、两线制总线,不分正负极性,施工简单;2、采用独特的电平特征传输数字信号,抗干扰能力强,传输距离长;3、可以选着总线供电,降低维护成本;4、总线型拓扑结构,扩展方便,组网成本低;5、任一

    2022年10月16日
  • 非常详细的rsyslogd配置文件解析

    非常详细的rsyslogd配置文件解析Rsyslog配置文件详解发表于2年前(2014-02-1017:25)  阅读(9805) | 评论(3) 10人收藏此文章, 我要收藏赞1rsyslog服务和logrotate服务======================================================================rsyslog是一个sysl

  • 系统错误&H80004005(-2147467259),未指定的错误。[通俗易懂]

    系统错误&H80004005(-2147467259),未指定的错误。[通俗易懂]系统错误&H80004005(-2147467259),未指定的错误。可能产生错误的原因:1.Flash的不断更新升级导致。2.较新版本中的MicrosoftOffice中阻止了Flash、Silverlight和Shockwave控件。解决方法一:说明:速战速决,注册表编辑启动控件,亲测可用!(缺点:可能会多编辑了一些注册表,因为是考虑了你的你电脑是32位和64…

  • netcore无线路由器_netcore路由器怎么设置

    netcore无线路由器_netcore路由器怎么设置IdentityServer里有各种Endpoint,如TokenEndpoint,UserInfoEndpoint,AuthorizeEndpoint,DiscoveryEndpoint等等。E

  • Spring整合Sharding-JDBC分库分表详情

    Spring整合Sharding-JDBC分库分表详情Spring整合Sharding-JDBC分库分表详情一、概述最初线上系统的业务量不是很大,业务数据量并不大,比如说单库的数据量在百万级别以下(事实上千万级别以下都还能支撑),那么MySQL的单库即可完成任何增/删/改/查的业务操作。随着业务的发展,单个DB中保存的数据量(用户、订单、计费明细和权限规则等数据)呈现指数级增长,那么各种业务处理操作都会面临单DB的IO读写瓶颈带来的性能问题。S…

  • [JAVA]定时任务之-Quartz使用篇

    [JAVA]定时任务之-Quartz使用篇定时任务之-Quartz使用篇        Quartz是OpenSymphony开源组织在Jobscheduling领域又一个开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独使用。Quartz可以用来创建简单或为运行十个,百个,甚至是好几万个Jobs这样复杂的日程序表。Jobs可以做成标准的Java组件或EJBs。官方网站:http://www.opensymphon

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号