我正在尝试制作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.]])
答案 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)
在下一种情况下,如果我们强制carr
为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)
并排显示两个案例: