plot_trisurf
ожидает x, y, z
как одномерные массивы, а plot_surface
ожидает X, Y, Z
как двухмерные массивы или как x, y, Z
с x, y
как одномерный массив и Z
как двумерный массив.
Ваши данные состоят из 3-х мерных массивов, поэтому их нанесение с помощью plot_trisurf
выполняется незамедлительно, но вам нужно использовать plot_surface
, чтобы можно было проецировать изолинии на координатные плоскости ... Вам необходимо изменить данные.
Кажется, что у вас есть 60000 точек данных, в следующем я предполагаю, что у вас есть регулярная сетка 300 точек в направлении x и 200 точек в y - но важна идея правильной сетки .
Приведенный ниже код показывает
- использование
plot_trisurf
(с более грубым значением sh), аналогичное вашему коду; - правильное использование изменения формы и ее применения в
plot_surface
;
обратите внимание, что количество строк в изменении формы соответствует количеству точек в y, а количество столбцов - количеству точек в x; - и 4 неправильное использование изменения формы, получающиеся в результате Возможно, вам просто нужно исправить количество строк и столбцов.
import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import Axes3D
x, y = np.arange(30)/3.-5, np.arange(20)/2.-5
x, y = (arr.flatten() for arr in np.meshgrid(x, y))
z = np.cos(1.5*np.sqrt(x*x + y*y))/(1+0.1*(x*x+y*y))
fig, axes = plt.subplots(2, 2, subplot_kw={"projection" : "3d"})
axes = iter(axes.flatten())
ax = next(axes)
ax.plot_trisurf(x,y,z, cmap='Reds')
ax.set_title('Trisurf')
X, Y, Z = (arr.reshape(20,30) for arr in (x,y,z))
ax = next(axes)
ax.plot_surface(X,Y,Z, cmap='Reds')
ax.set_title('Surface 20×30')
X, Y, Z = (arr.reshape(30,20) for arr in (x,y,z))
ax = next(axes)
ax.plot_surface(X,Y,Z, cmap='Reds')
ax.set_title('Surface 30×20')
X, Y, Z = (arr.reshape(40,15) for arr in (x,y,z))
ax = next(axes)
ax.plot_surface(X,Y,Z, cmap='Reds')
ax.set_title('Surface 40×15')
plt.tight_layout()
plt.show()