首页 > 解决方案 > 绘制 f(x,y) = z = min(x,y) 创建 2D 三角形而不是 3D 曲面

问题描述

我试图理解一个涉及笛卡尔平面的问题集,其中:

f(x, y) = min(x, y)
g(x, y) = max(x, y)
h(x, y) = x + y

出于这个原因,我试图使用 python 和 matplotlib 绘制给定的函数,如下所示:

data_x_axis = list(range(11))
data_y_axis = list(range(11))
data_z_axis = []

for x_value in data_x_axis:
    data_z_axis.append([min(x_value, y_value) for y_value in data_y_axis])

print(data_z_axis)


%matplotlib notebook
from mpl_toolkits.mplot3d import axes3d
import matplotlib.pyplot as plt
import numpy as np


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

# Grab some test data.
X = data_x_axis
Y = data_y_axis
Z = np.array(data_z_axis)

# Plot a basic wireframe.
ax.plot_wireframe(X, Y, Z, rstride=10, cstride=10)

plt.show()

本质上,这是来自: https ://matplotlib.org/mpl_toolkits/mplot3d/tutorial.html#wireframe-plots 的示例代码

x,y 值范围从 0 到 10,z 被计算为 min(x,y)。

然而结果是这样的:

在此处输入图像描述

我的数学已经过时了,但我期待的是表面积,而不是二维三角形。

我对基础数学的理解是错误的,还是我在计算值/在 matplotlib 中绘制它们时犯了错误?

标签: pythonmatplotlib

解决方案


它们应该是表面。你的数学是对的。

不幸的是,您正在绘制两个一维数组而不是二维数组:

data_x_axis = list(range(11))
data_y_axis = list(range(11))
X = data_x_axis
Y = data_y_axis
ax.plot_wireframe(X, Y, ....

这只是给你 11 个点来绘制。

尝试这个:

  1. X为和Y值创建一个数组
  2. 使用这些坐标(对)来计算Z
  3. 将每个Z与一对相关联:(X, Y)
  4. 现在绘制三元组(X, Y, Z)

推荐阅读