使用networkx绘制带节点坐标图(节点、节点坐标和边)

博客介绍了使用工具包创建并绘制无向图的过程。先导入工具包,用networkx创建空的无向图,添加节点和边,再用numpy格式化数据,绘制节点、边和标签,最后对坐标轴进行美化处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先导入需要的工具包

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()

结果如下图:
在这里插入图片描述
------------------------------------------------------------------------------------------------------------------------
坐标轴美化处理之前:
在这里插入图片描述
处理之后:
在这里插入图片描述

### 如何避免或处理NetworkX图形中节点重叠问题 在使用 NetworkX 绘制复杂网络图时,可能会遇到节点之间相互重叠的情况。这不仅影响可视化效果,还可能掩盖重要的拓扑特征。以下是几种有效的方法来减少甚至消除这种现象: #### 使用不同的布局算法 默认情况下,`spring_layout()` 是最常用的布局方法之一,但它并不总是能很好地分布节点位置。可以尝试其他类型的布局函数,比如 `kamada_kawai_layout()`, `spectral_layout()`, 或者更高级别的力导向布局。 ```python import networkx as nx import matplotlib.pyplot as plt G = nx.random_geometric_graph(20, 0.1) pos = nx.kamada_kawi_layout(G) # 更改此行为测试不同布局 plt.figure(figsize=(8, 6)) nx.draw(G, pos=pos, with_labels=True) plt.show() ``` #### 调整参数优化现有布局 对于某些特定的布局方式,可以通过调整其内部参数获得更好的展示效果。例如,在调用 `spring_layout()` 函数时增加迭代次数 (`iterations`) 可以使最终形成的图像更加稳定;设置较大的比例因子 (`scale`) 则有助于扩大整个图表的空间范围从而降低拥挤度。 ```python pos_spring = nx.spring_layout(G, iterations=50, scale=2.) nx.draw(G, pos=pos_spring, node_size=300, alpha=0.7, edge_color='gray') plt.axis('equal') plt.show() ``` #### 手动指定固定坐标 当已知部分顶点的确切地理位置或其他形式的位置信息时,可以直接为其设定固定的二维平面直角坐标系下的横纵坐标值作为绘图依据。这样做的好处是可以精确控制这些特殊节点之间的相对距离关系,进而间接改善整体构型的质量。 ```python fixed_positions = {node: (random.uniform(-1., 1.), random.uniform(-1., 1)) for node in G.nodes()} pos_fixed = fixed_positions.copy() for n in set(G).difference(fixed_positions): pos_fixed[n] = None nx.set_node_attributes(G,'pos',pos_fixed) nx.draw(G,pos=nx.get_node_attributes(G,'pos')) plt.show() ``` #### 应用第三方库增强交互体验 除了上述静态改进措施外,还可以借助 Bokeh、Plotly 等支持动态更新特性的数据可视化工具进一步提升用户体验。这类软件允许用户通过鼠标拖拽等方式实时改变各个组件间的排列组合状态,使得探索大规模社交圈层变得更加直观便捷[^4].
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值