如何从三列格式的距离文本文件绘制距离矩阵或热图?
三列距离数据转距离矩阵/热图的实现思路
核心思路
把三列(点A、点B、距离)的扁平数据,转换成对称的二维矩阵,再用可视化工具生成热图。以下是具体操作步骤(以Python工具链为例):
1. 读取并整理原始数据
用pandas读取空格分隔的文本文件,指定列名方便后续处理:
import pandas as pd # 读取单个文件,sep='\s+'适配任意数量空格分隔 df = pd.read_csv('distance_data.txt', sep='\s+', header=None, names=['point1', 'point2', 'distance']) # 如果是多个文件,循环读取合并(示例) # files = ['file1.txt', 'file2.txt'] # df_list = [pd.read_csv(f, sep='\s+', header=None, names=['point1', 'point2', 'distance']) for f in files] # combined_df = pd.concat(df_list)
2. 构建对称距离矩阵
原始数据只存储了非重复的点对(比如只存1-2,不存2-1),需要补全对称部分并填充对角线(自身距离为0):
# 获取所有唯一的点并排序,保证矩阵顺序一致 points = sorted(df['point1'].unique()) # 生成初始矩阵,缺失值先填0 dist_matrix = df.pivot_table( index='point1', columns='point2', values='distance', fill_value=0 ) # 补全对称部分(把矩阵转置后合并到原矩阵) dist_matrix = dist_matrix.combine_first(dist_matrix.T) # 填充对角线(自身到自身的距离为0) for p in points: dist_matrix.loc[p, p] = 0
3. 绘制热图
用seaborn的热图工具直接可视化矩阵,支持标注数值、自定义配色:
import seaborn as sns import matplotlib.pyplot as plt # 绘制热图,annot=True显示数值,cmap指定配色方案 sns.heatmap(dist_matrix, annot=True, cmap='viridis', square=True) plt.title('Distance Matrix Heatmap') plt.show()
额外注意事项
- 如果存在重复的点对数据(比如同一对出现多次),可以在
pivot_table中添加aggfunc='mean'(或sum/median)来聚合数值 - 若点ID不是连续数字(比如字符串),上述代码同样适用,
sorted()会按字符串顺序排列 - 多个文件的情况下,可以循环生成每个文件的热图,或合并数据后绘制对比热图
内容的提问来源于stack exchange,提问作者Lily Sharpton
相关产品推荐
相关产品推荐

