import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D # 创建数据点 x = np.linspace(-2, 2, 100) y = np.linspace(1, 3, 100) z1 = np.sqrt(4 * y**2 - y**2 - x**2) z2 = np.sqrt(4 - x**2 - y**2) # 绘制曲面1 fig1 = plt.figure() ax1 = fig1.add_subplot(111, projection='3d') ax1.plot_surface(x, y, z1, cmap='viridis') # 绘制曲面2 fig2 = plt.figure() ax2 = fig2.add_subplot(111, projection='3d') ax2.plot_surface(x, y, z2, cmap='magma') # 设置坐标轴标签 ax1.set_xlabel('X') ax1.set_ylabel('Y') ax1.set_zlabel('Z') ax2.set_xlabel('X') ax2.set_ylabel('Y') ax2.set_zlabel('Z') # 显示图形 plt.show() ValueError: Argument Z must be 2-dimensional.
时间: 2024-01-24 07:03:06 浏览: 121
import numpy as np import matplotlib.pyplot as plt import math
这个错误是因为 `plot_surface` 函数要求输入的 `Z` 值是一个二维数组,而 `z1` 和 `z2` 的维度是一维的。要解决这个问题,可以使用 `np.meshgrid` 函数将 `x` 和 `y` 转换为网格点坐标。
下面是修改后的代码:
```python
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
# 创建数据点
x = np.linspace(-2, 2, 100)
y = np.linspace(1, 3, 100)
X, Y = np.meshgrid(x, y)
Z1 = np.sqrt(4 * Y**2 - Y**2 - X**2)
Z2 = np.sqrt(4 - X**2 - Y**2)
# 绘制曲面1
fig1 = plt.figure()
ax1 = fig1.add_subplot(111, projection='3d')
ax1.plot_surface(X, Y, Z1, cmap='viridis')
# 绘制曲面2
fig2 = plt.figure()
ax2 = fig2.add_subplot(111, projection='3d')
ax2.plot_surface(X, Y, Z2, cmap='magma')
# 设置坐标轴标签
ax1.set_xlabel('X')
ax1.set_ylabel('Y')
ax1.set_zlabel('Z')
ax2.set_xlabel('X')
ax2.set_ylabel('Y')
ax2.set_zlabel('Z')
# 显示图形
plt.show()
```
现在,通过使用 `np.meshgrid` 函数,我们将 `x` 和 `y` 转换为网格点坐标 `X` 和 `Y`。然后,使用这些网格点坐标和计算得到的 `Z1` 和 `Z2` 值来绘制曲面。再次运行代码,应该能够成功绘制出曲面。
阅读全文