我正在使用函数 scatter 和 mplot3d 绘制 3D 散点图。我为图中的所有点选择一种颜色,但是当由 matplotlib 绘制时,点的透明度是相对于与相机的距离设置的。有什么办法可以禁用此功能?
我尝试将 alpha kwarg 设置为 None/1 并将 vmin/vmax 设置为 1(试图强制颜色缩放为纯单色),但没有成功。我在 scatter 文档中没有看到与此设置相关的任何其他可能选项。
谢谢!
我正在使用函数 scatter 和 mplot3d 绘制 3D 散点图。我为图中的所有点选择一种颜色,但是当由 matplotlib 绘制时,点的透明度是相对于与相机的距离设置的。有什么办法可以禁用此功能?
我尝试将 alpha kwarg 设置为 None/1 并将 vmin/vmax 设置为 1(试图强制颜色缩放为纯单色),但没有成功。我在 scatter 文档中没有看到与此设置相关的任何其他可能选项。
谢谢!
对于 Matplotlib 1.4+,@fraxel 下面提供的答案是最佳解决方案:ax.scatter
使用参数调用depthshade=False
。
没有任何论据可以控制这一点。这是一些黑客方法。
禁用set_edgecolors
和set_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_edgecolors
和set_facecolors
方法,你可以在禁用它们之前备份这两个方法:
s._set_facecolors, s._set_edgecolors = s.set_facecolors, s.set_edgecolors
ax.scatter(x, y, z, depthshade=0)
如果只想禁用 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()