使用Python和matplotlib控制3D散点图上的alpha值

19

我正在使用scatter和mplot3d函数绘制一个三维散点图。 我选择了一个颜色用于绘制所有点,但是当通过matplotlib绘制时,点的透明度相对于其与相机之间的距离而定。有没有办法禁用这个功能?

我已经尝试将alpha kwarg设置为None/1,还将vmin / vmax设置为1(试图强制颜色缩放为单一颜色),但没有成功。 我在scatter文档中没有看到任何其他可能与此设置相关的选项。

谢谢!

3个回答

16

对于Matplotlib 1.4+,下面由@fraxel提供的答案是最佳解决方案:使用参数depthshade=False调用ax.scatter

没有可以控制这个问题的参数。以下是一些hack方法。

禁用set_edgecolorsset_facecolors方法,使得mplot3d无法更新颜色的alpha部分:

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

fig = plt.figure()
ax = fig.gca(projection='3d')

x = np.random.sample(20)
y = np.random.sample(20)
z = np.random.sample(20)
s = ax.scatter(x, y, z, c="r")
s.set_edgecolors = s.set_facecolors = lambda *args:None

ax.legend()
ax.set_xlim3d(0, 1)
ax.set_ylim3d(0, 1)
ax.set_zlim3d(0, 1)

plt.show()

这里输入图片描述

如果您想稍后调用set_edgecolorsset_facecolors方法,则可以在禁用它们之前备份这两个方法:

s._set_facecolors, s._set_edgecolors = s.set_facecolors, s.set_edgecolors

1
如果有一个编程解决方案可以被称为“调皮”.. :) - BenB

13
ax.scatter(x, y, z, depthshade=0)

3
这是正确答案(适用于最近的matplotlib版本)。 - Tomer Vromen
不幸的是,它不能与色图一起使用 :/ 类似这样:cmap = "inferno"; surf = ax.scatter(xx, yy, zz, marker='o', c = zz, cmap = cmap, depthshade = False); fig.colorbar(surf, aspect=40) - Marine Galantin
与此不同的是:ax.scatter(xval, yval, zval, c=cval, alpha = 1, cmap=plt.cm.gray),其中alpha设置为1。 - Marine Galantin

6
如果你只想禁用alpha调整,你可以覆盖zalpha函数。这将允许您在交互式绘图的情况下更新颜色,并仍然消除深度雾化。
from mpl_toolkits.mplot3d import *
import numpy as np
import matplotlib.pyplot as plt
plt.ion()

art3d.zalpha = lambda *args:args[0]

fig = plt.figure()
ax = fig.gca(projection='3d')

x = np.random.sample(20)
y = np.random.sample(20)
z = np.random.sample(20)
s = ax.scatter(x, y, z, c="r")

ax.legend()
ax.set_xlim3d(0, 1)
ax.set_ylim3d(0, 1)
ax.set_zlim3d(0, 1)

plt.show()

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