Matplotlib 3D散点图观察不同角度时alpha值会发生变化。

4
在使用matplotlib创建3D散点图时,我注意到当点的alpha(透明度)变化时,它们的绘制方式会因为旋转视角的不同而发生变化。下面的示例图片是同一个图形稍微旋转后的结果,这导致了alpha值神秘地反转。有没有人熟悉这种行为并知道如何解决?看起来'zorder'(绘制顺序)是整个散点图调用的单个值。

enter image description hereenter image description here

重现简化示例代码:

import matplotlib.pyplot as plt

fig = plt.figure()
ax = fig.add_subplot(projection="3d")

X = [i for i in range(10)]
Y = [i for i in range(10)]
Z = [i for i in range(10)]
S = [(i+1)*400 for i in range(10)]
A = [i/10 for i in range(10)]

ax.scatter(xs=X, ys=Y, zs=Z, s=S, alpha=A)

plt.show()
  • Python 3.9.5
  • matplotlib 3.5.1

这个回答解决了你的问题吗?使用Python和matplotlib控制3D散点图的alpha值 - mcsoini
不幸的是,depthshade和art3d.zalpha(已弃用)解决方案都没有任何区别。 - Mandias
经过一些测试,我发现如果启用了alpha或depthshade中的任何一个,或者两者都启用,都会导致这个问题。 - Mandias
2个回答

2
我也在 matplotlib github 上发布了这个问题,以了解开发人员的想法。
根据他们最新的回复,这似乎是一个优先级非常低的错误: "我们有限的核心开发资源,mpl_toolkits/mplot3d 只是核心团队的次要任务。很可能需要社区中的某个人来修复。"
我会尝试去解决这个问题,但同时发布此问题以增加可见度,以便让其他更有经验的人知道。

1

一种可能的解决方法是使用for循环添加每个点,例如:

import matplotlib.pyplot as plt

fig = plt.figure()
ax = fig.add_subplot(projection="3d")

X = [i for i in range(10)]
Y = [i for i in range(10)]
Z = [i for i in range(10)]
S = [(i+1)*400 for i in range(10)]
A = [i/10 for i in range(10)]

for x, y, z, s, a in zip(X, Y, Z, S, A):
    ax.scatter(xs=x, ys=y, zs=z, s=s, alpha=a, color="tab:blue")

plt.show()

是的,这确实解决了奇怪的alpha行为,但如果可能的话,我宁愿不使用for循环。使用此方法处理大量数据点时,绘图速度要慢得多。 - Mandias

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