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

使用Matplotlib绘制密度图遇Invalid shape错误的技术求助

解决matplotlib绘制密度图时的"Invalid shape (12,) for image data"错误

问题背景

尝试使用Test.txt中的散点数据绘制密度图,运行代码时触发形状不匹配错误。

Test.txt数据

x    y         z
1   0.1     -1.18976
3   0.1     -0.95538
4   0.1     -1.1647
5   0.1     -1.11199
1   0.01    -1.02719
3   0.01    -0.83643
4   0.01    -0.94146
5   0.01    -0.97814
1   0.001   -1.27374
3   0.001   -1.58571
4   0.001   -1.65026
5   0.001   -1.62557

原代码

import matplotlib.pyplot as plt
import matplotlib.cm as cm
import numpy as np
x, y, z = np.loadtxt('Test.txt', unpack=True)

plt.imshow(z,cmap=cm.hot)
plt.colorbar()
plt.show()

报错信息

Traceback (most recent call last):

  File "C:\Users\USER\OneDrive - Technion\Research_Technion\Python_PNM\Sept17_2022\Plotting\Plot.py", line 14, in <module>
    plt.imshow(z,cmap=cm.hot)

  File "C:\Users\USER\anaconda3\lib\site-packages\matplotlib\pyplot.py", line 2903, in imshow
    __ret = gca().imshow(

  File "C:\Users\USER\anaconda3\lib\site-packages\matplotlib\__init__.py", line 1361, in inner
    return func(ax, *map(sanitize_sequence, args), **kwargs)

  File "C:\Users\USER\anaconda3\lib\site-packages\matplotlib\axes\_axes.py", line 5609, in imshow
    im.set_data(X)

  File "C:\Users\USER\anaconda3\lib\site-packages\matplotlib\image.py", line 709, in set_data
    raise TypeError("Invalid shape {} for image data"

TypeError: Invalid shape (12,) for image data

错误原因

plt.imshow()要求输入二维数组(对应M×N网格上的数值分布),但当前读取的z是一维数组(形状(12,)),因为你的数据是散点形式的(x,y,z),并非规整的网格数据,因此无法直接传入imshow。

解决方案

根据需求选择以下两种方式:

方式1:将散点插值为规整网格后绘制

通过插值将散点数据转换为二维网格,适合生成连续的密度图像:

import matplotlib.pyplot as plt
import matplotlib.cm as cm
import numpy as np
from scipy.interpolate import griddata

# 读取原始数据
x, y, z = np.loadtxt('Test.txt', unpack=True)

# 生成覆盖数据范围的规整网格
xi = np.linspace(x.min(), x.max(), 100)  # x方向100个采样点
yi = np.linspace(y.min(), y.max(), 100)  # y方向100个采样点
xi, yi = np.meshgrid(xi, yi)

# 用三次插值将z值映射到网格上(可替换为'linear'或'nearest')
zi = griddata((x, y), z, (xi, yi), method='cubic')

# 绘制密度图,设置坐标范围和原点
plt.imshow(zi, extent=[x.min(), x.max(), y.min(), y.max()], origin='lower', cmap=cm.hot)
plt.colorbar(label='z值')
plt.xlabel('x')
plt.ylabel('y')
plt.show()

方式2:直接基于散点绘制三角剖分密度图

无需插值,直接通过三角剖分生成连续的密度填充,适合保留原始散点特征:

import matplotlib.pyplot as plt
import matplotlib.cm as cm
import numpy as np

x, y, z = np.loadtxt('Test.txt', unpack=True)

# 绘制三角剖分填充等高线
plt.tricontourf(x, y, z, cmap=cm.hot, levels=15)
plt.colorbar(label='z值')
# 叠加原始散点作为参考
plt.scatter(x, y, c='black', s=15, edgecolor='white')
plt.xlabel('x')
plt.ylabel('y')
plt.show()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 14:05:20