为DataFrame指定行生成热力图:基于智能体距离差值的100×100矩阵
实现指定行的智能体距离差值热力图
没问题,这需求很清晰,咱们一步步来实现:
1. 提取指定行的智能体距离数据
首先,你需要从DataFrame中提取目标时间(或指定行)对应的id0到id99列的数据。假设你想选择Time=500的那行,可以这样做:
import pandas as pd import numpy as np import seaborn as sns import matplotlib.pyplot as plt # 假设你的DataFrame名为df target_time = 500 # 替换成你需要的目标时间 # 提取目标行的id列数据,转成一维数组 selected_data = df.loc[df['Time'] == target_time, 'id0':'id99'].values.flatten()
如果是按行索引(比如第1000行,注意Python是0索引,所以要减1),可以改用iloc:
selected_row_index = 999 # 对应第1000行 selected_data = df.iloc[selected_row_index, 1:].values.flatten() # 第1列是Time,所以从索引1开始取
2. 计算id_i - id_j的差值矩阵
利用numpy的广播特性,我们可以快速生成100×100的差值矩阵:
# 生成差值矩阵,shape为(100,100),其中matrix[i,j] = id_i - id_j diff_matrix = selected_data[:, np.newaxis] - selected_data
这里的广播原理是把一维数组selected_data变成(100,1)的列向量,然后和原一维数组(视为(1,100)的行向量)做减法,自动扩展成100×100的矩阵,完美对应每对智能体的差值。
3. 绘制热力图
用seaborn的heatmap函数可以直观展示这个差值矩阵:
plt.figure(figsize=(12, 10)) # 设置图的大小 # 绘制热力图,cmap选冷暖色调来区分正负差值 sns.heatmap(diff_matrix, cmap='coolwarm', xticklabels=[f'id{j}' for j in range(100)], yticklabels=[f'id{i}' for i in range(100)], annot=False) # 如果需要显示具体数值,可以把annot设为True,但100×100会很挤 # 设置标题和轴标签 plt.title(f'Distance Difference (id_i - id_j) at Time {target_time}', fontsize=14) plt.xlabel('id_j', fontsize=12) plt.ylabel('id_i', fontsize=12) plt.tight_layout() # 自动调整布局 plt.show()
额外提示
- 如果你的
id列命名不是严格从id0到id99(比如有缺失或命名不规则),可以用df.filter(regex='^id')来提取所有以id开头的列,确保不会漏选。 - 如果你觉得坐标轴的标签太密集,可以通过
xticklabels和yticklabels参数设置显示间隔,比如xticklabels=[f'id{j}' for j in range(0,100,5)],只显示每5个id的标签。
内容的提问来源于stack exchange,提问作者khaldi
相关产品推荐
相关产品推荐

