如何优化定义域为三角形的二维函数绘图?含等边三角形展示需求
绘制f(x,y)=x²+y²的指定三角形区域并优化显示
针对你要绘制函数f(x,y)=x²+y²(定义域为x≥0、y≥0、x+y≤1)的需求,这里提供两种优化方案:一种是在原坐标系中仅保留目标三角形区域并调整视觉比例为等边;另一种是通过坐标变换将区域映射为标准等边三角形。
方案1:原坐标系下保留目标区域并视觉化为等边三角形
实现代码
import numpy as np import matplotlib.pyplot as plt def compute_function(x, y): return x**2 + y**2 # 生成x,y网格 x = np.arange(0, 1, 0.01) y = np.arange(0, 1, 0.01) X, Y = np.meshgrid(x, y) Z = compute_function(X, Y) # 标记并隐藏超出定义域的区域(x+y>1) mask = X + Y > 1 Z[mask] = np.nan # 创建绘图对象 fig, ax = plt.subplots() im = ax.imshow(Z, cmap='RdBu', extent=(0, 1, 0, 1), origin='lower') # 添加颜色条 plt.colorbar(im) # 调整纵横比,让直角三角形视觉上等边 # 等边三角形高为√3/2,因此y轴单位长度需对应x轴的√3/2倍,纵横比设为2/√3 ax.set_aspect(2 / np.sqrt(3)) # 标注坐标轴与斜边 ax.set_xlabel('x') ax.set_ylabel('y') ax.plot([0, 1], [1, 0], 'k--', label='x+y=1') ax.legend() plt.show()
关键细节
- 隐藏无关区域:通过
Z[mask] = np.nan将x+y>1的区域设为无效值,imshow会自动跳过这些区域的渲染,只保留目标三角形。 - 视觉等边调整:利用
ax.set_aspect(2/np.sqrt(3))调整坐标轴比例,让原本的直角三角形在视觉上呈现为等边三角形——等边三角形的高是边长的√3/2倍,这个比例能让y轴的显示长度匹配等边三角形的高度要求。
方案2:坐标变换为标准等边三角形
如果需要将定义域真正映射为等边三角形坐标系(而非仅视觉调整),可以通过坐标变换实现:
实现代码
import numpy as np import matplotlib.pyplot as plt def compute_function(x, y): return x**2 + y**2 # 生成原坐标系网格 x = np.arange(0, 1, 0.01) y = np.arange(0, 1, 0.01) X, Y = np.meshgrid(x, y) # 坐标变换:将直角三角形映射为等边三角形 # (x,y) → (u,v),其中u = x + y/2,v = (y*√3)/2 U = X + Y / 2 V = (Y * np.sqrt(3)) / 2 # 计算函数值并隐藏超出定义域的区域 Z = compute_function(X, Y) mask = X + Y > 1 Z[mask] = np.nan # 使用pcolormesh绘制变换后的区域(适配非规则网格) fig, ax = plt.subplots() im = ax.pcolormesh(U, V, Z, cmap='RdBu') # 添加颜色条 plt.colorbar(im) # 保持坐标轴等比例,确保等边三角形显示正确 ax.set_aspect('equal') # 标注坐标轴与三角形顶点 ax.set_xlabel('u') ax.set_ylabel('v') ax.scatter([0, 1, 0.5], [0, 0, np.sqrt(3)/2], c='black', s=40, label='Vertices') ax.legend() plt.show()
关键细节
- 坐标变换逻辑:变换公式将原三角形的三个顶点
(0,0)、(1,0)、(0,1)映射为(0,0)、(1,0)、(0.5, √3/2),构成标准等边三角形。 - 绘图选择:使用
pcolormesh而非imshow,因为变换后的网格不再是规则矩形,pcolormesh能更好地处理非规则坐标映射的渲染。
内容的提问来源于stack exchange,提问作者Erel Segal-Halevi
相关产品推荐
相关产品推荐

