点不透明度相对于深度 matplotlib 3D 点图

Point opacity relative to depth matplotlib 3D point plot

我正在使用来自另一个 SO post(Matplotlib scatter plot legend(最佳答案))的代码在 3D 中绘制基本散点图,但希望点不透明度相对于 'depth'点与 ax.scatter depthshade=True.

我不得不使用 ax.plot 因为 ax.scatter 似乎不能很好地处理 3D 图上的图例。

我想知道是否有办法为 ax.plot 获得类似的美感。

谢谢!

看来你运气不好,情节似乎没有 depthshade=True 功能。我认为问题是 plot 不允许您像 scatter 那样为每个点设置不同的颜色(或 alpha 值),我猜这就是 depthshade 的应用方式。

一个解决方案是循环遍历所有点并逐一设置颜色,与 mpl_toolkits.mplot3d.art3d.zalpha 辅助函数一起提供深度。

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

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

n = 100
xs = np.random.rand(n)
ys = np.random.rand(n)
zs = np.random.rand(n)
color = [1,0,0,1]

#Get normal to camera
alpha= ax.azim*np.pi/180.
beta= ax.elev*np.pi/180.
n = np.array([np.cos(alpha)*np.sin(beta), 
              np.sin(alpha)*np.cos(beta), 
              np.sin(beta)])
ns = -np.dot(n, [xs, ys, zs])
cs = mpl_toolkits.mplot3d.art3d.zalpha(color, ns)

for i in range(xs.shape[0]):
    ax.plot([xs[i]], [ys[i]], [zs[i]], 'o', color=cs[i])

plt.show()

一个棘手的问题是需要使用相机位置ax.elevax.azim来计算法向量。此外,当您旋转相机的位置时,它的颜色将不再正确。要解决此问题,您可以按如下方式注册更新事件,

def Update(event):
    #Update normal to camera
    alpha= ax.azim*np.pi/180.
    beta= ax.elev*np.pi/180.
    n = np.array([np.cos(alpha)*np.sin(beta), 
                  np.sin(alpha)*np.cos(beta), 
                  np.sin(beta)])
    ns = -np.dot(n, [xs, ys, zs])
    cs = mpl_toolkits.mplot3d.art3d.zalpha(color, ns)
    for i, p in enumerate(points):
        p[0].set_alpha(cs[i][3])

fig.canvas.mpl_connect('draw_event', Update)

points = []
for i in range(xs.shape[0]):
    points.append(ax.plot([xs[i]], [ys[i]], [zs[i]], 'o', color=cs[i]))