绘制Contour图时无法完整显示44×54矩阵全部行列的问题
解决Contour图无法完整展示矩阵首/末行/列的问题
我来帮你搞定这个困扰!你遇到的核心问题是对matplotlib.pyplot.contourf中坐标数组的含义理解有点偏差,导致边缘数据被截断。咱们一步步来解决:
问题根源分析
你的矩阵是44行×54列,你生成的x1(54个元素)和x2(44个元素)长度本身是符合要求的,但你把坐标设成了网格块的边界,而不是数据对应的位置/中心。contourf默认会把x和y数组当作数据点的坐标,然后在相邻点之间绘制轮廓,这就导致边缘的网格块只有一半能显示在图中,看起来像是首/末行/列被省略了。
两种可行的解决方案
方案一:使用网格单元的中心坐标
如果你的数据是每个网格单元的数值,那么x和y应该对应单元的中心位置,再手动调整坐标轴范围覆盖整个网格区域:
修改后的代码如下:
import numpy as np import matplotlib.pyplot as plt def contour_plot(filename): # 读取数据(这里用随机数据模拟,实际替换回np.loadtxt(filename)) data = np.random.random((44,54)) # 生成网格单元的中心坐标 # 54列对应54个中心x坐标,从0.5*130.75到(54-0.5)*130.75 x1 = [(i + 0.5) * 130.75 for i in range(54)] # 44行对应44个中心y坐标 x2 = [(j + 0.5) * 130.75 for j in range(44)] plt.contourf(x1, x2, data[::-1]) plt.colorbar() plt.title("Porosity") # 调整坐标轴范围,覆盖整个网格的边界(从0到最大边界值) plt.xlim(0, 54 * 130.75) plt.ylim(0, 44 * 130.75) plt.savefig('Porosity.png', bbox_inches='tight') contour_plot("Nechelik.dat")
方案二:使用网格的边界坐标(更直观)
contourf也支持直接传入网格的边界坐标,此时x的长度是列数+1,y的长度是行数+1,矩阵的每个元素对应一个边界围成的矩形区域:
修改后的代码如下:
import numpy as np import matplotlib.pyplot as plt def contour_plot(filename): data = np.random.random((44,54)) # 生成网格边界坐标:54列对应55个x边界(0到54*130.75) x_bound = [i * 130.75 for i in range(55)] # 44行对应45个y边界(0到44*130.75) y_bound = [j * 130.75 for j in range(45)] # 传入边界坐标,contourf会自动把data的每个元素对应到对应的矩形区域 plt.contourf(x_bound, y_bound, data[::-1]) plt.colorbar() plt.title("Porosity") plt.savefig('Porosity.png', bbox_inches='tight') contour_plot("Nechelik.dat")
为什么这样能解决问题?
- 方案一中,中心坐标让每个数据点对应网格单元的中心,再通过
xlim和ylim把坐标轴范围扩展到整个网格的边界,确保边缘单元完整显示。 - 方案二中,直接使用边界坐标,
contourf会明确知道每个数据元素对应的是哪个矩形区域,自然能完整覆盖所有44行54列的数据,不需要额外调整坐标轴范围。
你可以根据自己的习惯选择其中一种方案,两种都能解决你遇到的边缘数据缺失问题!
内容的提问来源于stack exchange,提问作者Kunal Singhal
相关产品推荐
相关产品推荐

