代码之家  ›  专栏  ›  技术社区  ›  hatmatrix

是否按颜色定义从打印中排除点?

  •  2
  • hatmatrix  · 技术社区  · 14 年前

    我正在尝试制作一个三维散点图,并对符号进行颜色编码。如果RGB颜色由 nan ,为什么这些点是用黑色绘制的?这个表达是可以的:

    import numpy as np
    import matplotlib.pyplot as plt
    from mpl_toolkits.mplot3d import Axes3D
    
    carr = np.array([[0,0,0,1],[0,0,1,1],[0,1,0,1]]) # RGBA color array
    
    ax = plt.axes(projection='3d')
    h = ax.scatter([1,2,3],[1,2,3],[1,2,3],
                   c=carr)
    plt.draw()
    

    带有nan的新颜色阵列:

    carr = np.array([[0,0,0,1],np.repeat(np.nan,4),[0,1,0,1]])
    
    ax = plt.axes(projection='3d')
    h = ax.scatter([1,2,3],[1,2,3],[1,2,3],
                   c=carr)
    plt.draw()
    

    颜色定义为的点 南 显示为黑色,而不是什么都没有或其他颜色。有没有办法让它不出现?在R中,颜色定义为 NA 不打印,当您通过某种逻辑表达式指定颜色时,这很方便。

    当然我总是可以对数组进行子集打印,但如果我可以用颜色定义排除它,那会更好。

    顺便说一句,为什么

    carr[1:] = np.nan
    

    在第一个定义之后 carr 给我

    array([[                   0,                    0,                    0,
                               1],
           [-9223372036854775808, -9223372036854775808, -9223372036854775808,
            -9223372036854775808],
           [                   0,                    1,                    0,
                               1]])
    

    而不是

    array([[  0.,   0.,   0.,   1.],
           [ nan,  nan,  nan,  nan],
           [  0.,   1.,   0.,   1.]])
    
    1 回复  |  直到 14 年前
        1
  •  2
  •   Hooked    14 年前

    这与3D打印无关,同样的问题也存在于 matplotlib.scatter 也实际上有两个问题。第一个是 不同的 carr 的内部类型不同 。请注意,这将失败:

    import numpy as np
    import pylab as plt
    
    # This fails since carr[0,0] is of type numpy.int64
    carr = np.array([[0,0,0,1],[0,0,1,1],[0,1,0,1]]) # RGBA color array
    carr[1] = np.repeat(np.nan,4)
    
    pts = np.array([[1,2],[1,3],[2,2]]).T
    plt.scatter(pts[0],pts[1],c=carr,s=500)
    

    在下一种情况下,如果我们强制 卡尔 成为 numpy.float 我们可以绘制,但如前所述 nan 的显示为黑点:

    # This works but still puts a black dot for the nan point
    carr = np.array([[0.0,0,0,1],[0,0,1,1],[0,1,0,1]]) # RGBA color array
    carr[1] = np.repeat(np.nan,4)
    
    pts = np.array([[1,2],[1,3],[2,2]]).T
    plt.scatter(pts[0],pts[1],c=carr,s=500)
    

    如果我们定义一个掩码,我们可以索引我们想要的点。这是处理numpy数组时的首选方法:

    carr = np.array([[0.0,0,0,1],[0,0,1,1],[0,1,0,1]]) # RGBA color array
    carr[1] = np.repeat(np.nan,4)
    pts = np.array([[1,2],[1,3],[2,2]]).T
    
    idx = ~np.isnan(carr[:,0])
    plt.scatter(pts[0][idx],pts[1][idx],c=carr[idx],s=500)
    

    并排显示两个案例:

    enter image description here