如何用Matplotlib在3D图中标记270-300的温度区间?
解决3D温度图中标记目标区间(270-300K)的问题
你之前的问题出在:叠加图形时新建了独立的fig和ax对象,相当于绘制了另一张独立的图,而非在原3D图上添加标记。正确的做法是在同一个3D坐标轴上,通过掩码筛选目标温度区域,单独绘制该子区域来突出显示。
修改后的完整代码
import numpy as np import matplotlib.pyplot as plt from matplotlib import cm # 物理常数与参数 Sigma = 5.67e-8 Fo = 1367 do = 1 d = 1 F = Fo * ((do/d)**2) # 生成3D数据网格 A2 = np.arange(0, 1, 0.01) Epsilon2 = np.arange(0, 1, 0.01) A2, Epsilon2 = np.meshgrid(A2, Epsilon2) # 计算地球表面温度 T_Earth2 = (((1 - A2)*F)/(4*Sigma*(1 - (1/2*Epsilon2))))**(1/4) # 创建3D绘图对象 fig, ax = plt.subplots(subplot_kw={"projection": "3d"}) # 绘制基础温度表面图 surf = ax.plot_surface(A2, Epsilon2, T_Earth2, vmin=T_Earth2.min()*2, cmap=cm.coolwarm, ec="gray", lw=0.2, alpha=0.7) plt.colorbar(surf, label="Temperature (K)") # 生成温度区间掩码(270-300K) mask = (T_Earth2 >= 270) & (T_Earth2 <= 300) # 将掩码外的温度值设为NaN,绘图时会自动忽略这些区域 T_mark = np.where(mask, T_Earth2, np.nan) # 在原坐标轴上绘制目标区域,用高亮颜色区分 ax.plot_surface(A2, Epsilon2, T_mark, color="limegreen", ec="black", lw=0.3) # 设置坐标轴标签 ax.set_xlabel('Albedo (A)') ax.set_ylabel('Emissivity (ε)') ax.set_zlabel('Temperature (K)') plt.savefig("3D_with_marked_region.png", dpi=150) plt.show()
关键说明
- 掩码筛选:用
(T_Earth2 >=270) & (T_Earth2 <=300)生成布尔掩码,精准筛选出目标温度对应的(A, ε)点集合。 - NaN值处理:将非目标区域的温度设为
np.nan,plot_surface会自动跳过这些点,只渲染符合条件的区域。 - 同坐标轴绘制:所有绘图操作都基于最初创建的
ax对象,确保目标区域叠加在原3D图上,而非生成新图覆盖。 - 视觉区分:用与基础图反差强烈的颜色(比如亮绿色)绘制目标区域,同时给基础图设置
alpha=0.7增加透明度,让标记区域更醒目。
内容的提问来源于stack exchange,提问作者EJHowell121
相关产品推荐
相关产品推荐

