Я пытаюсь создать трехмерную фигуру высоты, у меня есть обычная сетка, данные о высоте, собранные датчиком, и данные хранятся в файле с именем «data.txt». данные хранятся по одному в строке. ссылка на файл на гитхабе
import numpy as np
import matplotlib.pyplot as pit
from mpl_toolkits.mplot3d import Axes3D
from scipy.stats import multivariate_normal
from matplotlib import cm
x = np.linspace(0,350,18)
y = np.linspace(0,350,15)
z = np.loadtxt('data.txt')
xx,yy = np.meshgrid(x,y)
fig = pit.figure()
ax = fig.add_subplot(111,projection='3d')
ax.scatter(xx,yy,z)
используйте код выше, я получил скаттер. Это выглядит хорошо! Я нашел это , я хочу преобразовать фигуру в поверхность, чем я добавляю код ниже, но это выглядит очень странно
xa = np.reshape(xx, (18,15))
ya = np.reshape(yy, (18,15))
za = np.reshape(z, (18,15))
surf=ax.plot_surface(xa,ya,za,cmap="summer",linewidth=0,antialiased=False, alpha=0.5)
fig.colorbar(surf)
pit.show()
Я не знаю, что случилось, это выглядит слишком странно! Должен ли я сгладить его?
Вам нужно использовать xx
и yy
, определенные ранее, и изменить форму z
до той же формы, что и xx
:
za = z.reshape(xx.shape)
fig = pit.figure()
ax = fig.add_subplot(111,projection='3d')
surf=ax.plot_surface(xx,yy,za,cmap="summer",linewidth=0,antialiased=False, alpha=0.5)
fig.colorbar(surf)
pit.show()
Обратите внимание, что я повернул диаграмму для большей ясности.
Я думаю, вам нужен scipy.griddata. Попробуйте этот код:
from scipy.interpolate import griddata
za = griddata(x, y, z, (xx, yy), method='linear')
surf=ax.plot_surface(xx,yy,za,cmap="summer",linewidth=0,antialiased=False, alpha=0.5)
fig.colorbar(surf)
plt.show()