求助:使用Matplotlib绘制二维颜色图及构造计算数组
解决Matplotlib绘制二维颜色图的问题
问题分析
你的代码已正确构造二维网格并通过循环计算得到Removal_fraction数组,核心逻辑可行,只需添加Matplotlib绘图代码即可生成目标颜色图。
完整代码实现
import numpy as np import matplotlib.pyplot as plt import CoolProp.CoolProp as cp # 确保已安装并导入CoolProp def removal_fraction(P_inlet,T_inlet,P_tank): # 闪蒸罐压力为P_tank,单位Pa(a) H_inlet=cp.PropsSI('H',"P",P_inlet,"T",T_inlet,"water") # 入口流体焓值,J/kg H_sensible_tank=cp.PropsSI('H',"P",P_tank,"Q",0,"water") # 罐内饱和液体焓值,J/kg Latent_heat_transferred=H_inlet-H_sensible_tank # 用于汽化的热量,J/kg H_latent_tank=cp.PropsSI('H',"P",P_tank,"Q",1,"water")-cp.PropsSI('H',"P",P_tank,"Q",0,"water") # 汽化潜热,J/kg # 处理物理上不合理的负蒸发率 R_water_evap=np.maximum(Latent_heat_transferred/H_latent_tank, 0) return R_water_evap P_inlet=np.linspace(200000,100000*40,500) # 入口压力,Pa(a) T_inlet=np.linspace(90+273.15,200+273.15,500) # 入口温度,K P_tank=(14.7-10)*6894.76 # 闪蒸罐压力,Pa(a) # 创建二维网格 P_inlet_vals,T_inlet_vals=np.meshgrid(P_inlet,T_inlet,indexing='ij') Removal_fraction=np.zeros(P_inlet_vals.shape) # 逐点计算蒸发率 for i in range(len(P_inlet)): for j in range(len(T_inlet)): Removal_fraction[i,j]=removal_fraction(P_inlet_vals[i,j],T_inlet_vals[i,j],P_tank) # ---------------------- 绘制二维颜色图 ---------------------- plt.figure(figsize=(10, 8)) # 使用pcolormesh绘制颜色网格(也可替换为contourf绘制填充等高线) im = plt.pcolormesh( P_inlet/1000, # 转换为kPa,提升可读性 T_inlet-273.15, # 转换为℃,符合工程习惯 Removal_fraction.T, # 转置数组适配Matplotlib的xy索引逻辑 cmap='viridis', shading='auto' ) # 添加颜色条并标注含义 plt.colorbar(im, label='Water Evaporation Fraction (kg/kg)') # 设置坐标轴与标题 plt.xlabel('Inlet Pressure (kPa)') plt.ylabel('Inlet Temperature (℃)') plt.title('Water Evaporation Fraction vs Inlet Pressure & Temperature') plt.tight_layout() plt.show()
关键细节说明
- 数组转置:因创建网格时用了
indexing='ij',Removal_fraction形状为(压力点数, 温度点数),而Matplotlib默认按(温度点数, 压力点数)渲染,需用.T转置数组才能正确对应坐标轴。 - 单位转换:将Pa转为kPa、K转为℃,让图表更直观易读。
- 异常值处理:用
np.maximum限制蒸发率≥0,避免出现物理上不合理的负数值。 - 循环优化(可选):若嫌双层循环代码繁琐,可改用
np.vectorize包装函数,底层仍为循环但代码更简洁:vec_removal = np.vectorize(removal_fraction) Removal_fraction = vec_removal(P_inlet_vals, T_inlet_vals, P_tank)
内容的提问来源于stack exchange,提问作者remusconnor
相关产品推荐
相关产品推荐

