You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Pandas从含像素位置的CSV文件绘制热力图?

解决CSV像素数据绘制热力图的报错问题

问题背景

你有一份包含像素坐标(x、y)和对应数值的文本文件,格式如下:

0 0 8.400000e+01
1 0 8.500000e+01
2 0 8.700000e+01
3 0 8.500000e+01
4 0 9.400000e+01
5 0 7.700000e+01
6 0 8.000000e+01
7 0 8.300000e+01
8 0 8.900000e+01
9 0 8.500000e+01
10 0 8.300000e+01

你编写的Python代码运行时报错TypeError: Image data of dtype object cannot be converted to float,代码如下:

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns

path_to_csv= "/run/media/test.txt"
df= pd.read_csv(path_to_csv ,sep='\t')
plt.imshow(df,cmap='hot',interpolation='nearest')

plt.show(df)

报错原因及解决步骤

1. 修正数据读取逻辑

你的数据是空格分隔,不是制表符(\t),且无列名,直接读取会把第一行数据误判为列名,导致数据类型混乱。读取时需指定分隔符和列名:

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns

path_to_csv = "/run/media/test.txt"
# 指定列名,用正则匹配任意数量的空格作为分隔符
df = pd.read_csv(path_to_csv, sep=r'\s+', names=['x', 'y', 'value'])
# 强制转换数值列为float类型
df['value'] = df['value'].astype(float)

2. 重塑数据为二维矩阵

imshow和seaborn.heatmap都需要二维数组作为输入,当前数据是长格式,需将x、y坐标映射到矩阵的行列位置,填充对应数值:

# 获取x、y的最大索引,确定矩阵尺寸
max_x = df['x'].max()
max_y = df['y'].max()
# 创建空矩阵
heatmap_data = np.zeros((max_y + 1, max_x + 1))
# 遍历数据填充矩阵
for _, row in df.iterrows():
    heatmap_data[row['y'], row['x']] = row['value']

3. 绘制热力图

方法一:使用Matplotlib的imshow

plt.imshow(heatmap_data, cmap='hot', interpolation='nearest')
plt.colorbar(label='数值')
plt.xlabel('X坐标')
plt.ylabel('Y坐标')
plt.show()

方法二:使用Seaborn的heatmap

sns.heatmap(heatmap_data, cmap='hot', annot=False, cbar=True)
plt.xlabel('X坐标')
plt.ylabel('Y坐标')
plt.show()

完整可运行代码

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns

path_to_csv = "/run/media/test.txt"
# 读取并预处理数据
df = pd.read_csv(path_to_csv, sep=r'\s+', names=['x', 'y', 'value'])
df['value'] = df['value'].astype(float)

# 构建热力图矩阵
max_x = df['x'].max()
max_y = df['y'].max()
heatmap_data = np.zeros((max_y + 1, max_x + 1))
for _, row in df.iterrows():
    heatmap_data[row['y'], row['x']] = row['value']

# 绘制Matplotlib热力图
plt.figure(figsize=(8, 4))
plt.imshow(heatmap_data, cmap='hot', interpolation='nearest')
plt.colorbar(label='数值')
plt.xlabel('X坐标')
plt.ylabel('Y坐标')
plt.title('Matplotlib热力图')
plt.show()

# 绘制Seaborn热力图
plt.figure(figsize=(8, 4))
sns.heatmap(heatmap_data, cmap='hot', cbar=True, cbar_kws={'label': '数值'})
plt.xlabel('X坐标')
plt.ylabel('Y坐标')
plt.title('Seaborn热力图')
plt.show()

内容的提问来源于stack exchange,提问作者user979974

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 17:10:19