Функция построения трехмерного графика в заданной области с помощью matplotlib

Я пытаюсь визуализировать функцию трех параметров над кубом в R ^ 3, чтобы получить представление о гладкости функции. Пример этой проблемы показан в примере кода ниже.

%pylab
from mpl_toolkits.mplot3d import Axes3D
import itertools

x = np.linspace(0,10,50)
y = np.linspace(0,15,50)
z = np.linspace(0,8,50)

points = []
for element in itertools.product(x, y, z):
    points.append(element)

def f(vals):
    return np.cos(vals[0]) + np.sin(vals[1]) + vals[2]**0.5

fxyz = map(f, points)
xi, yi, zi = zip(*points)

fig = plt.figure(figsize=(12, 8))
ax = fig.add_subplot(111, projection='3d')
ax.scatter(xi, yi, zi, c=fxyz, alpha=0.5)
plt.show()

куб

Проблема с этим подходом заключается в том, что внутреннюю часть куба нельзя визуализировать. Есть ли лучший способ построить график функции над некоторым плотным подмножеством R ^ 3?


person mgilbert    schedule 21.12.2014    source источник
comment
Я предлагаю вам использовать Mayavi.   -  person HYRY    schedule 21.12.2014
comment
Как уже упоминалось, для этого лучше использовать другое программное обеспечение, например Mayavi. Можно использовать два метода: изоповерхность и объемная визуализация.   -  person nicoguaro    schedule 21.12.2014
comment
@HYRY Спасибо, это было именно то, что я искал   -  person mgilbert    schedule 21.12.2014


Ответы (1)


Как предположили @HYRY и @nicoguaro в комментариях выше, Mayavi гораздо лучше подходит для такого типа работы. здесь есть хороший набор примеров, которые Я использовал для справки. Вот что я придумал

import numpy as np
from mayavi import mlab

x = np.linspace(0,10,50)
y = np.linspace(0,15,50)
z = np.linspace(0,8,50)

X, Y, Z = np.meshgrid(x, y, z)

s = np.cos(X) + np.sin(Y) + Z**0.5
b1 = np.percentile(s, 20)
b2 = np.percentile(s, 80)
mlab.pipeline.volume(mlab.pipeline.scalar_field(s), vmin=b1, vmax=b2)
mlab.axes()
mlab.show()

После чего я повернул фигуру на нужные углы с помощью графического интерфейса и сохранил нужные виды.

angle1угол2

person mgilbert    schedule 21.12.2014