【发布时间】:2014-10-06 20:25:44
【问题描述】:
我有一个 (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()
【问题讨论】:
-
对于这个应用程序,我认为您最好使用 mayavi,它对于 3D 可视化应用程序更强大。这是文档中的example,应该可以帮助您入门。
标签: python matplotlib scipy mayavi kernel-density