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、何もない色や他の色ではなく、黒で表示されます。表示されないようにする方法はありますか?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.]])
4

1 に答える 1

2

これは3Dプロットとは関係がなく、同じ問題が同様に存在しmatplotlib.scatterます。本当に2つの問題があります。1つ目は、異なる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.floatnan

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

2つのケースを並べて表示します。

ここに画像の説明を入力してください

于 2012-08-09T13:46:08.453 に答える