点不透明度相对于深度 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.elev
和ax.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]))
我正在使用来自另一个 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.elev
和ax.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]))