相对于深度matplotlib 3D Point p的点不透明度

2024-06-25 23:21:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用另一个SO post(Matplotlib scatter plot legend(顶部答案))的代码在3D中绘制一个基本的散射图,但是我想让点的不透明度相对于点的深度,就像ax.scatterdepthshade=True。在

enter image description here

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

我想知道是否有一种方法可以让ax.plot获得相似的美学效果。在

谢谢!在


Tags: 方法答案代码truesoplotmatplotlib绘制
1条回答
网友
1楼 · 发布于 2024-06-25 23:21:49

看起来你在这方面运气不好,似乎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.elev和{}来计算法向量。此外,当您旋转相机的位置时,它将不再是正确的颜色。要解决此问题,可以注册一个更新事件,如下所示:

^{pr2}$

相关问题 更多 >