У меня есть большой набор данных о положениях белка (x, y, z) и хотел бы строить участки с высокой заполняемостью в качестве тепловой карты. В идеале вывод должен выглядеть аналогично объемной визуализации ниже, но я не уверен, как это сделать с помощью matplotlib.
Моя первоначальная идея состояла в том, чтобы отобразить мои позиции в виде графика 3D-рассеяния и покрасить их плотность через KDE. Я закодировал это следующим образом с данными теста:
import numpy as np
from scipy import stats
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
mu, sigma = 0, 0.1
x = np.random.normal(mu, sigma, 1000)
y = np.random.normal(mu, sigma, 1000)
z = np.random.normal(mu, sigma, 1000)
xyz = np.vstack([x,y,z])
density = stats.gaussian_kde(xyz)(xyz)
idx = density.argsort()
x, y, z, density = x[idx], y[idx], z[idx], density[idx]
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.scatter(x, y, z, c=density)
plt.show()
Это хорошо работает! Однако мои реальные данные содержат много тысяч точек данных и вычисляют kde, и график рассеяния становится чрезвычайно медленным.
Небольшой образец моих реальных данных:
Мои исследования предполагают, что лучшим вариантом является оценка гауссовского kde на сетке. Я просто не уверен, как это происходит в 3D:
import numpy as np
from scipy import stats
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
mu, sigma = 0, 0.1
x = np.random.normal(mu, sigma, 1000)
y = np.random.normal(mu, sigma, 1000)
nbins = 50
xy = np.vstack([x,y])
density = stats.gaussian_kde(xy)
xi, yi = np.mgrid[x.min():x.max():nbins*1j, y.min():y.max():nbins*1j]
di = density(np.vstack([xi.flatten(), yi.flatten()]))
fig = plt.figure()
ax = fig.add_subplot(111)
ax.pcolormesh(xi, yi, di.reshape(xi.shape))
plt.show()