大家好,又见面了,我是你们的朋友全栈君。
例如在读取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图文件,有两个问题影响使用
在图数据读取后,我们在算法中处理数据时往往会对图的节点集和边集进行处理,下面提供几种遍历方式:
在绘制图时,有时我们可能需要为节点着不同的颜色,展示不同属性和大小等等,需要为边添加不同的线型,颜色、粗细等等,这时需要分步绘制,其各类属性如下:
# 画点 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))]