从颜色定义的绘图中排除点?

时间:2012-08-09 11:11:22

标签: python matplotlib

我正在尝试制作3D散点图并对符号进行颜色编码。如果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()

将颜色定义为nan的点以黑色显示,而不是以任何颜色或其他颜色显示。有没有办法让它不显示?在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 个答案:

答案 0 :(得分:2)

这与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)

在下一种情况下,如果我们强制carrnumpy.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