Я определил значение z = f (x, y) для сетки точек на плоскости:
import numpy as np
n_theta, n_phi = 20, 30
thetas = np.linspace(0, 1, n_theta) * np.pi
phis = np.linspace(0, 1, n_phi) * (2 * np.pi)
res = f(thetas, phis)
# 'res' is an np.array with res.shape=(600,3), where each row is [x, y, z]
Учитывая meshgrid
из x
's и y
, я интерполирую функцию, используя мои предыдущие данные для z
, и строю контурную карту результата:
from scipy.interpolate import griddata
import matplotlib.pyplot as plt
X, Y = np.meshgrid(res[:,0], res[:,1])
Z = griddata(res[:,0:2], res[:,2], (X, Y), method='cubic') # Interpolate function.
fig = plt.figure()
contour = plt.contourf(X, Y, Z, levels=100)
Это отлично работает, и результат (пример данных, связанных ниже) что-то вроде этого (что на самом деле не та форма, которую я искал в моем конкретном моделировании):
Однако, когда я запускаю тот же скрипт со значениями phi
(горизонтальная ось) только для половины исходного интервала (или, что то же самое, взять только эту половину моих данных), я получаю контур, подобный этому:
(Ради полноты, если я сделаю это для второй половины интервала и вручную поставлю обе цифры рядом, результат будет похож на следующий, который больше похож на то, что я ожидать получения полных данных):
(При необходимости Вот примерные данные для создания графиков , за которыми следует фрагмент, который можно использовать):
import numpy as np
from scipy.interpolate import griddata
import matplotlib.pyplot as plt
# Full axis:
res = np.load("stackoverflow-example-data")
X, Y = np.meshgrid(res[:,0], res[:,1])
Z = griddata(res[:,0:2], res[:,2], (X, Y), method='cubic') # Interpolate function.
fig = plt.figure()
contour = plt.contourf(X, Y, Z, levels=100)
# Half axis:
half = np.array([res[i,:] for i in range(len(res)) if res[i,0] <= np.pi])
X, Y = np.meshgrid(res[:,0], res[:,1])
Z = griddata(res[:,0:2], res[:,2], (X, Y), method='cubic') # Interpolate function.
fig = plt.figure()
contour = plt.contourf(X, Y, Z, levels=100)
Так чего мне здесь не хватает?
- это правильная процедура для интерполяции и построения контура так, как я хочу?
- Разве я не должен ожидать получения аналогичных результатов для всей оси и только для половины ее? Если нет, то почему?