使用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
相关产品推荐
相关产品推荐

