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

Python matplotlib新手求助:如何绘制三维约束区域曲面图

绘制满足约束的3D曲面与区域

核心思路

不用手动遍历每个点,利用numpy的向量化操作批量生成符合约束的网格点,再用matplotlib完成绘图。

基础曲面绘制(z=1-x-y的上边界)

先补充必要的库导入,再基于你的初始代码修改:

import numpy as np
import matplotlib.pyplot as plt

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

# 生成x的采样点,增加点数让曲面更平滑
xs = np.linspace(0, 1, 50)
# 创建x和y的网格矩阵
xs, ys = np.meshgrid(xs, xs)

# 筛选出满足y ≤ 1-x的点,超出部分设为nan(绘图时自动忽略)
mask = ys > 1 - xs
zs = 1 - xs - ys
zs[mask] = np.nan

# 绘制曲面,cmap设置颜色映射
ax.plot_surface(xs, ys, zs, cmap='viridis')

# 设置坐标轴标签和标题
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z')
ax.set_title('$z=1-x-y$ (with $x∈[0,1], y∈[0,1-x]$)')

plt.show()

完整约束区域展示(包含z∈[0,1-x-y]的空间)

如果需要展示整个符合约束的三维区域,可以绘制四面体的四个边界面:

import numpy as np
import matplotlib.pyplot as plt

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

# 绘制z=0的面(xy平面上的三角形)
x_xy = np.linspace(0,1,50)
y_xy = 1 - x_xy
ax.plot_trisurf(x_xy, y_xy, np.zeros_like(x_xy), alpha=0.5, color='cornflowerblue')

# 绘制y=0的面(xz平面上的三角形)
x_xz = np.linspace(0,1,50)
z_xz = 1 - x_xz
ax.plot_trisurf(x_xz, np.zeros_like(x_xz), z_xz, alpha=0.5, color='lightgreen')

# 绘制x=0的面(yz平面上的三角形)
y_yz = np.linspace(0,1,50)
z_yz = 1 - y_yz
ax.plot_trisurf(np.zeros_like(y_yz), y_yz, z_yz, alpha=0.5, color='salmon')

# 绘制z=1-x-y的上边界曲面
xs, ys = np.meshgrid(np.linspace(0,1,50), np.linspace(0,1,50))
mask = ys > 1 - xs
zs = 1 - xs - ys
zs[mask] = np.nan
ax.plot_surface(xs, ys, zs, cmap='viridis', alpha=0.8)

# 设置坐标轴标签和标题
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z')
ax.set_title('Complete Constrained 3D Region')

plt.show()

关键代码解释

  • np.meshgrid:生成二维网格矩阵,实现批量计算所有(x,y)点对应的z值,比循环遍历效率高得多。
  • mask:通过布尔索引筛选出符合y ≤ 1-x的点,将不符合条件的z值设为np.nan,matplotlib会自动忽略这些无效点,只绘制约束内的区域。
  • plot_surface/plot_trisurf:分别用于绘制曲面和三角形面,alpha参数控制透明度,方便观察重叠区域。

内容的提问来源于stack exchange,提问作者user23021439

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 04:15:37