Python导入.dat文件绘制密度图出现reshape报错的原因及解决方法
错误原因
你当前代码的核心问题在于reshape操作的前提不成立:
- 你的总数据量为42485,
int(len(z)**.5)计算得到的206的平方为42436,和总数据量不匹配,无法完成维度转换。 - 只有当x、y是严格的规则网格采样(即x有M个唯一值、y有N个唯一值,总数据量恰好为M*N,且数据按网格顺序排列)时,才能直接用
reshape把z转成二维矩阵,你的原始.dat数据显然不满足这个前提。 - 额外笔误:原代码中
cm.hot会报错,因为未导入cm模块,可直接替换为字符串'hot'。
修复方案
方案1:适配非方形规则网格
如果你的数据本身是规则网格结构,只是x、y的唯一值数量不相等,可通过提取x、y的唯一值来确定reshape的维度:
import matplotlib.pyplot as plt import numpy as np # 读取数据 x, y, z = np.loadtxt('data.dat', unpack=True, delimiter='\t') # 获取x和y的唯一值 ux = np.unique(x) uy = np.unique(y) # 按实际网格维度reshape z = z.reshape(len(uy), len(ux)) # 绘图 plt.pcolormesh(ux, uy, z, cmap='hot') plt.colorbar() plt.show()
方案2:散乱点插值后绘图
如果你的数据是无预设网格的散乱采样点,可通过插值生成规则网格后再绘制密度图:
import matplotlib.pyplot as plt import numpy as np from scipy.interpolate import griddata # 读取数据 x, y, z = np.loadtxt('data.dat', unpack=True, delimiter='\t') # 生成200*200的规则网格,可自行调整分辨率 xi = np.linspace(x.min(), x.max(), 200) yi = np.linspace(y.min(), y.max(), 200) xi, yi = np.meshgrid(xi, yi) # 插值计算网格对应z值,可选插值方法:'nearest'(最快)、'linear'、'cubic'(最平滑) zi = griddata((x, y), z, (xi, yi), method='cubic') # 绘图,origin='lower'保证y轴坐标方向和原始数据一致 plt.imshow(zi, extent=(x.min(), x.max(), y.min(), y.max()), origin='lower', cmap='hot') plt.colorbar() plt.show()
内容的提问来源于stack exchange,提问作者HeitorGalacian
相关产品推荐
相关产品推荐

