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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 15:15:03