Я хочу использовать Matplotlib, чтобы сделать 3D-график с учетом функции z - PullRequest
18 голосов
/ 04 января 2012

У меня есть функция z, которая принимает параметры x и y и возвращает вывод z. Я хочу построить это в 3d и установить шкалы. Как я могу сделать это легко? Я потратил слишком много времени на просмотр документации, и ни разу я не нашел способ сделать это.

1 Ответ

25 голосов
/ 04 января 2012

Стиль построения зависит от ваших данных: вы пытаетесь построить трехмерную кривую (линию), поверхность или разброс точек?

В первом примере ниже я только что использовал простую сетку из равномерно распределенных точек в плоскости 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()

scatter


Для поверхностей это немного отличается, вы передаете сетку для домена в 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 в документации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...