Python绘制Fortran生成的100×100数组等高线图问题求助
解决Fortran生成数组的Python等高线图绘制问题
核心问题:维度匹配错误
你用np.meshgrid(x, y)生成的X和Y默认采用笛卡尔坐标索引(indexing='xy'),输出形状为(len(y), len(x));而你导入的f是按Fortran列优先(order="F")重塑为(len(x), len(y)),两者维度无法对应,导致绘图数值错位。
修正方案1:转置数组匹配meshgrid
import numpy as np import matplotlib.pyplot as plt x = np.linspace(0.02, 10, 100) y = np.linspace(0.47, 4, 100) # 导入Fortran生成的数组 f = np.fromfile('/path/result.dat', dtype=np.float64).reshape((len(x), len(y)), order="F") # 转置数组,让维度与meshgrid输出匹配 f_transposed = f.T # 生成笛卡尔坐标网格 X, Y = np.meshgrid(x, y)
正确绘制等高线图
之前colors='black'会导致所有填充区域颜色一致,无法区分数值,建议使用色彩映射并指定等高线层级:
# 根据数据范围生成20个等高线层级 levels = np.linspace(f_transposed.min(), f_transposed.max(), 20) # 绘制填充等高线 plt.contourf(X, Y, f_transposed, levels=levels, cmap='viridis') # 添加颜色条标注数值 plt.colorbar(label='数值') # 设置坐标轴与标题 plt.xlabel('x') plt.ylabel('y') plt.title('Fortran数组等高线图') plt.show()
修复imshow绘图问题
imshow默认采用矩阵索引,需手动指定范围和原点匹配你的坐标体系:
# extent参数定义x/y轴范围,origin='lower'让y轴从下到上递增 plt.imshow(f_transposed, extent=[x.min(), x.max(), y.min(), y.max()], origin='lower', cmap='viridis', aspect='auto') plt.colorbar(label='数值') plt.xlabel('x') plt.ylabel('y') plt.title('Fortran数组热力图') plt.show()
修正方案2:调整meshgrid索引模式
如果不想转置数组,可以用indexing='ij'让meshgrid直接匹配f的维度逻辑:
X, Y = np.meshgrid(x, y, indexing='ij') plt.contourf(X, Y, f, levels=levels, cmap='viridis')
此时X[i,j]对应x[i]、Y[i,j]对应y[j],与f[i,j]的数值逻辑完全对齐。
内容的提问来源于stack exchange,提问作者Lyapunov
相关产品推荐
相关产品推荐

