用pylab绘制3D散点图并投影到2D平面上的数据

16
我想创建一个简单的三维散点图,但我也想在同一图中显示这些数据的二维投影。这能够展示出在三维图中难以观察到的两个变量之间的相关性。
我记得以前在某处看到过这样的例子,但现在找不到了。
下面是一个玩具例子:
x= np.random.random(100)
y= np.random.random(100)
z= sin(x**2+y**2)

fig= figure()
ax= fig.add_subplot(111, projection= '3d')
ax.scatter(x,y,z)
2个回答

31
您可以使用plot方法并指定zdir来添加3D散点数据的2D投影:
import numpy as np
import matplotlib.pyplot as plt

x= np.random.random(100)
y= np.random.random(100)
z= np.sin(3*x**2+y**2)

fig= plt.figure()
ax= fig.add_subplot(111, projection= '3d')
ax.scatter(x,y,z)

ax.plot(x, z, 'r+', zdir='y', zs=1.5)
ax.plot(y, z, 'g+', zdir='x', zs=-0.5)
ax.plot(x, y, 'k+', zdir='z', zs=-1.5)

ax.set_xlim([-0.5, 1.5])
ax.set_ylim([-0.5, 1.5])
ax.set_zlim([-1.5, 1.5])

plt.show()

输入图像描述


有没有办法使用imshow或contour而不是plot来完成这个操作?当使用contour时,我似乎无法将轮廓值(应该是投影密度)与“zdir”维度值分离。在您的示例中,轮廓(例如,来自直方图)可能具有范围为[0,5]的值,但您的轴范围为[-.5,1.5]。 - paradiso
2
应该在调用 ax.scatter(..) 之前调用 ax.plot(..)。否则,投影将出现在散点数据点的前面(除非这是期望的行为)。 - steffen
我想用ax.fill_between(x, z)代替ax.plot(x, z, 'r+', zdir='y', zs=1.5),但是PolyCollection不支持它。你有什么办法可以解决这个问题吗? - giammi56
有没有可能以这样的方式完成,即根据3D轴的位置动态更改xs/ys/zs? - Translunar
zs = -1.5 是什么作用? - Coding_Day

7

另一个答案适用于matplotlib 0.99,但1.0及更高版本需要略微不同的代码(此代码已检查过v1.3.1):

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

x= np.random.random(100)
y= np.random.random(100)
z= np.sin(3*x**2+y**2)

fig= plt.figure()
ax = Axes3D(fig)
ax.scatter(x,y,z)

ax.plot(x, z, 'r+', zdir='y', zs=1.5)
ax.plot(y, z, 'g+', zdir='x', zs=-0.5)
ax.plot(x, y, 'k+', zdir='z', zs=-1.5)

ax.set_xlim([-0.5, 1.5])
ax.set_ylim([-0.5, 1.5])
ax.set_zlim([-1.5, 1.5])

plt.show() 

您可以通过导入matplotlib并打印版本字符串来查看其版本:

import matplotlib
print matplotlib.__version__

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接