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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 17:35:25