如何关联三个TXT文件数据并绘制带颜色区分的散点图?
FE模型数据关联与散点图实现指导
我需要生成一张按数值区分颜色的散点图,但FE模型导出的数据存在关联逻辑问题:每个单元对应4个节点(4组坐标),但多个单元共用的节点仅会被记录一次坐标。目前我有三个txt文件:
- 包含单元编号及绘图用分析数据的文件
- 包含单元编号与对应节点编号的文件
- 包含节点编号与对应坐标的文件
以下是我已尝试的初始代码:
from numpy import loadtxt from fpdf import FPDF Sek = ['Sektion_100'] I = 0 HeaderY =['nr.','LC','Element nr.','Myy','Nyy','MRd_y','URy'] HeaderX =['nr.','LC','Element nr.','Mxx','Nxx','MRd_x','URx'] pdf = FPDF(orientation = 'P', unit = 'mm', format = 'A4') MaxURx =[] MaxURy =[] # 加载分析数据 data = loadtxt("Loads/Sektion_150.txt", unpack=False, skiprows=1) nr = data[:,1] Mxx = data[:,2] Nxx = -data[:,4] Myy = data[:,3] Nyy = -data[:,5] # 加载单元-节点拓扑数据 topologi = loadtxt("Loads/Sektion_150_topologi.txt", unpack=False, skiprows=1) nr1 = topologi[:,0] node1 = topologi[:,1] node2 = topologi[:,2] node3 = topologi[:,3] node4 = topologi[:,4] # 加载节点坐标数据 knuder = loadtxt("Loads/Sektion_150_knuder.txt", unpack=False, skiprows=1) nr2 = knuder[:,0] x = knuder[:,1] y = knuder[:,2] z = knuder[:,3]
实现方向指导
1. 构建节点坐标映射字典
先把节点编号和坐标做一对一映射,后续可以直接通过节点编号快速获取坐标,避免重复循环查找:
# 构建节点编号到(x,y,z)坐标的映射 node_coords = {} for row in knuder: node_id = int(row[0]) # 确保节点编号为整数,避免匹配误差 node_coords[node_id] = (row[1], row[2], row[3])
2. 关联单元、节点与分析数据
遍历拓扑文件中的每个单元,匹配对应的分析数据(比如用于配色的URx/URy),再逐个获取节点坐标:
# 先构建单元编号到目标分析值的映射(这里以URx为例) unit_analysis = {} for row in data: unit_id = int(row[1]) # data中第二列是Element nr. urx_val = row[6] # 对应HeaderX中的URx列 unit_analysis[unit_id] = urx_val # 整合所有绘图所需数据 plot_points = [] for row in topologi: unit_id = int(row[0]) # 获取当前单元的4个节点编号 current_nodes = [int(row[1]), int(row[2]), int(row[3]), int(row[4])] # 获取该单元的配色数值 color_val = unit_analysis.get(unit_id) if not color_val: continue # 跳过无分析数据的单元 # 逐个节点提取坐标,加入绘图列表 for node_id in current_nodes: coords = node_coords.get(node_id) if coords: # 这里选择x,y坐标绘图,可根据需求换成x/z或y/z plot_points.append( (coords[0], coords[1], color_val) )
3. 绘制带颜色区分的散点图
使用matplotlib实现可视化,颜色由分析数值决定:
import matplotlib.pyplot as plt # 拆分绘图数据 xs = [p[0] for p in plot_points] ys = [p[1] for p in plot_points] color_values = [p[2] for p in plot_points] # 绘制散点图 plt.scatter(xs, ys, c=color_values, cmap='viridis') plt.colorbar(label='URx 数值') # 标注颜色对应的参数 plt.xlabel('X 坐标') plt.ylabel('Y 坐标') plt.title('FE模型节点散点图(按URx值配色)') plt.show()
关键注意事项
- 确保所有编号(单元、节点)统一为整数类型,避免因浮点型导致匹配失败
- 对缺失数据(比如无对应分析数据的单元、无坐标的节点)做跳过处理,防止报错
- 可根据需求调整绘图的坐标维度(比如用x-z平面),只需修改
plot_points中的坐标索引即可
内容的提问来源于stack exchange,提问作者Mandsberg1
相关产品推荐
相关产品推荐

