2

我正在尝试制作 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点显示为黑色,而不是没有任何颜色或其他颜色。有没有办法让它不显示?NA在 R 中,不绘制颜色定义为的点,这在您通过某种逻辑表达式指定颜色时很方便。

当然......我总是可以对数组进行子集化以进行绘图,但如果我可以使用颜色定义将其排除在外,那就更好了。

顺便说一句,为什么

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.]])
4

1 回答 1

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成为 anumpy.float我们可以绘制,但如前所述nan's 显示为黑点:

# 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)

并排显示两种情况:

在此处输入图像描述

于 2012-08-09T13:46:08.453 回答