首先导入需要的工具包
import matplotlib.pyplot as plt
import networkx as nx
import numpy as np
使用networkx创建一个空的无向图
G = nx.Graph() # 创建一个空的无向图
将对应的节点并添加到网络中
# 节点的个数
num = 6
nodes = list(range(num)) # [0,1,2,3,4,5]
# 将节点添加到网络中
G.add_nodes_from(nodes) # 从列表中加点
将节点相关的边加入网络
edges = [] # 存放所有的边,构成无向图(去掉最后一个结点,构成一个环)
for idx in range(num - 1):
edges.append((idx, idx + 1))
edges.append((num - 1, 0))
# 将所有边加入网络
G.add_edges_from(edges)
绘制图像:
nx.draw_networkx(G)
未加入坐标与节点映射的图像如下:
使用numpy工具来格式化数据
# 每个节点对应坐标坐标
coordinates = [[1, 2], [2, 2], [3, 2], [3, 1], [2, 1], [1, 1]]
# 可导入自己所需的数据
# np.loadtxt()
vnode= np.array(coordinates)
npos = dict(zip(nodes, vnode)) # 获取节点与坐标之间的映射关系,用字典表示
# 若显示多个图,可将所有节点放入该列表中
# pos = {}
# pos.update(npos)
nlabels = dict(zip(nodes, nodes)) # 标志字典,构建节点与标识点之间的关系
绘制节点、边和标签的函数如下:
draw_networkx_nodes(G, pos, nodelist=None,node_size=300,node_color='r',node_shape='o', alpha=1.0,cmap=None,vmin=None,vmax=None,ax=None,linewidths=None,label=None,**kwds):
draw_networkx_edges(G, pos, edgelist=None, width=1.0, edge_color='k', style='solid', alpha=1.0, edge_cmap=None, edge_vmin=None, edge_vmax=None, ax=None, arrows=True, label=None, **kwds)
draw_networkx_labels(G, pos, labels=None, font_size=12, font_color='k', font_family='sans-serif', font_weight='normal', alpha=1.0, bbox=None, ax=None, **kwds)
绘制所有的节点、边、标签与节点的坐标
nx.draw_networkx_nodes(G, npos, node_size=50, node_color="#6CB6FF") # 绘制节点
nx.draw_networkx_edges(G, npos, edges) # 绘制边
nx.draw_networkx_labels(G, npos, nlabels) # 标签
为了使画出的图坐落在坐标轴中间(进行美化处理)
x_max,y_max = vnode.max(axis=0) # 获取每一列最大值
x_min, y_min = vnode.min(axis=0) # 获取每一列最小值
x_num = (x_max - x_min) / 10
y_num = (y_max - y_min) / 10
# print(x_max, y_max, x_min, y_min)
plt.xlim(x_min - x_num, x_max + x_num)
plt.ylim(y_min - y_num, y_max + y_num)
绘制结果如下:
plt.show()
结果如下图:
------------------------------------------------------------------------------------------------------------------------
坐标轴美化处理之前:
处理之后: