Хитрость заключается в том, чтобы интерполировать по сетке перед построением графика - я бы использовал для этого scipy
.Ниже R
- это (500,3) массив значений XYZ, а V
- это «величина» в каждой точке XYZ.
from scipy.interpolate import griddata
import numpy as np
# Create some test data, 3D gaussian, 200 points
dx, pts = 2, 100j
N = 500
R = np.random.random((N,3))*2*dx - dx
V = np.exp(-( (R**2).sum(axis=1)) )
# Create the grid to interpolate on
X,Y,Z = np.mgrid[-dx:dx:pts, -dx:dx:pts, -dx:dx:pts]
# Interpolate the data
F = griddata(R, V, (X,Y,Z))
Отсюда несложно отобразить наши данные:
from mayavi.mlab import *
contour3d(F,contours=8,opacity=.2 )
Это дает хороший (кусковой) гауссиан.
Посмотрите документы для griddata , обратите внимание, что вы можетеизменить метод интерполяции.Если у вас больше точек (как на интерполированной сетке, так и на наборе данных), интерполяция становится все лучше и лучше представляет основную функцию, которую вы пытаетесь проиллюстрировать.Вот приведенный выше пример с 10K-точками и более точной сеткой: