【问题标题】:Controlling alpha value on 3D scatter plot using Python and matplotlib使用 Python 和 matplotlib 控制 3D 散点图上的 alpha 值
【发布时间】:2018-09-12 22:37:11
【问题描述】:

我正在使用函数 scatter 和 mplot3d 绘制 3D 散点图。我为图中的所有点选择一种颜色,但是当由 matplotlib 绘制时,点的透明度是相对于与相机的距离设置的。有什么办法可以禁用此功能?

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

谢谢!

【问题讨论】:

    标签: python numpy matplotlib


    【解决方案1】:

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

    没有任何参数可以控制这一点。这是一些hack方法。

    禁用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
    

    【讨论】:

    • 如果有一个可以被称为“厚脸皮”的编程解决方案.. :)
    【解决方案2】:
    ax.scatter(x, y, z, depthshade=0)
    

    【讨论】:

    • 这是正确答案(对于最近的 matplotlib 版本)
    • 很遗憾不能使用颜色图:/ 类似这样的东西:cmap = "inferno"; surf = ax.scatter(xx, yy, zz, marker='o', c = zz, cmap = cmap, depthshade = False); fig.colorbar(surf, aspect=40)
    • 而不是这样:ax.scatter(xval, yval, zval, c=cval, alpha = 1, cmap=plt.cm.gray) alpha 设置为 1
    【解决方案3】:

    如果你只想禁用 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()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-06-23
      • 1970-01-01
      • 1970-01-01
      • 2016-07-17
      • 2015-10-18
      • 2012-05-09
      • 1970-01-01
      相关资源
      最近更新 更多