我想使用matplotlib根据给定的z函数制作3D图。

25

我有一个接受 x 和 y 参数并返回 z 输出的 z 函数。我想在三维中绘制它并设置比例。如何轻松实现这一点?我已经花了太多时间查看文档,但从未看到过这样的做法。

1个回答

34

绘图风格取决于您的数据:您是要绘制三维曲线(线条)、表面还是点的散布图?

在下面的第一个示例中,我只是在x-y平面上使用了一个简单的均匀间隔点网格作为定义域。通常,您首先创建xs和ys的定义域,然后从中计算zs。

此代码应该为您提供一个可工作的示例,以便开始尝试:

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()

散点图


对于表面,情况有些不同,您需要通过2D数组中的网格来传递其定义域。下面是一个平滑表面的示例:

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教程


由于某些原因,当我更改函数时,图形基本上保持不变?有没有办法只做一个平滑的曲面? - WhatsInAName
1
对于最后一个图,有没有一种方法可以根据z值来着色表面?比如使用颜色地图? - Luís de Sousa
1
为什么要将大的 XY 定义为网格 X, Y = np.meshgrid(x, y)。我们不能只使用 for i in range(size(x)) : for j in range(size(y)) : z[i,j]=f(x[i],y[j]),即循环遍历所有小的 xy 并计算函数值吗?然后用 ax.plot_surface(x, x, z) 绘制。 - Alexander Cska
@WhatsInAName 它完全正常运作。尝试使用 np.sin(x) + np.sin(np.log(y+4)) 或者更波浪的东西。 - Guimoute

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接