我想用matplotlib绘制一个给定z函数的3D图形

25 投票
1 回答
23960 浏览
提问于 2025-04-17 09:30

我有一个叫做 z 的函数,它需要两个参数 x 和 y,然后会返回一个 z 的结果。我想把这个结果画成三维图,并且设置坐标的刻度。请问我该怎么简单地做到这一点呢?我花了太多时间在文档里找,结果一次也没看到怎么做。

1 个回答

34

绘图的风格取决于你的数据:你是想画一个三维曲线(线)、一个表面,还是一堆散点呢?

在下面的第一个例子中,我只是用了一个简单的网格,这个网格在x-y平面上均匀分布。一般来说,你首先需要创建一组x和y的值,然后再根据这些值计算出z的值。

这段代码应该能给你一个可以开始尝试的示例:

import numpy as np
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import random

def fun(x, y):
    return x + y

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
n = 10
xs = [i for i in range(n) for _ in range(n)]
ys = list(range(n)) * n
zs = [fun(x, y) for x,y in zip(xs,ys)]

ax.scatter(xs, ys, zs)

ax.set_xlabel('X Label')
ax.set_ylabel('Y Label')
ax.set_zlabel('Z Label')

plt.show()

scatter


对于表面图,情况就有点不同了,你需要用二维数组传入一个网格。这里有一个平滑表面的例子:

import numpy as np
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import random

def fun(x, y):
    return x**2 + y

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
x = y = np.arange(-3.0, 3.0, 0.05)
X, Y = np.meshgrid(x, y)
zs = np.array([fun(x,y) for x,y in zip(np.ravel(X), np.ravel(Y))])
Z = zs.reshape(X.shape)

ax.plot_surface(X, Y, Z)

ax.set_xlabel('X Label')
ax.set_ylabel('Y Label')
ax.set_zlabel('Z Label')

plt.show()

surface

想要更多的例子,可以查看文档中的 mplot3d 教程

撰写回答