我有一个三维空间中的点云,并估计了这些点上的一些分布(也是在三维空间中;使用kernel density estimation,尽管这与此问题无关)。我想将该分布的投影绘制为所有三个轴(x,y和z)上的等高线图。对于z轴(即,即投影到到处具有相同z坐标平面上):
import numpy as np
import scipy as sp
import scipy.stats
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import axes3d
# generate some points of a 3D Gaussian
points = np.random.normal(size=(3, 50))
# do kernel density estimation to get smooth estimate of distribution
# make grid of points
x, y, z = np.mgrid[-4:4:100j, -4:4:100j, -4:4:100j]
kernel = sp.stats.gaussian_kde(points)
positions = np.vstack((x.ravel(), y.ravel(), z.ravel()))
density = np.reshape(kernel(positions).T, x.shape)
# now density is 100x100x100 ndarray
# plot points
ax = plt.subplot(projection='3d')
ax.plot(points[0,:], points[1,:], points[2,:], 'o')
# plot projection of density onto z-axis
plotdat = np.sum(density, axis=2)
plotdat = plotdat / np.max(plotdat)
plotx, ploty = np.mgrid[-4:4:100j, -4:4:100j]
ax.contour(plotx, ploty, plotdat, offset=-4)
ax.set_xlim((-4, 4))
ax.set_ylim((-4, 4))
ax.set_zlim((-4, 4))
但是,在Matplotlib中似乎没有实现对其他轴执行此操作。如果我使用this example中概述的方法,并指定一个zdir
关键字参数:
# plot projection of density onto x-axis
plotdat = np.sum(density, axis=0)
plotdat = plotdat / np.max(plotdat)
ploty, plotz = np.mgrid[-4:4:100j, -4:4:100j]
ax.contour(ploty, plotz, plotdat, offset=-4, zdir='x')
轮廓的生成是“沿着另一个切片”完成的,也就是说:
而我想要这样的东西(糟糕的绘画技巧;希望思路清晰):
我想到的一个选择是沿着默认的zdir='z'
生成轮廓,然后在3D空间中旋转生成的曲线,但我不知道如何实现这一点。我将非常感谢任何指针!
1条答案
按热度按时间yb3bgrhw1#
我试图通过将沿着轴求和计算的数据与
np.mgrid
创建的网格混合来修改等高线图。我计算了沿着轴的密度之和,我想在轴上得到轮廓。如下所示:不幸的是,我对内核密度估计不是很熟悉,所以我希望我没有理解完全错误的东西,但是如果你添加上面的几行代码,生成的结果看起来与你的花式绘画图片类似:)