web-dev-qa-db-ja.com

Python:クラスに応じた無効なRGBA引数0.0カラーポイント

コンテキスト

いくつかのポイントがあります

_ points = np.random.uniform(0,10, size = (10,2))
# array([[ 7.35906037,  6.50049804],
       [ 3.21883403,  3.81452312],
       [ 3.52107154,  1.68233797],
       [ 1.47699577,  6.01692348],
       [ 3.76051589,  0.25213394],
       [ 8.93701081,  5.20377479],
       [ 6.5347188 ,  2.12940006],
       [ 3.62550069,  5.80619507],
       [ 1.33393325,  5.0088937 ],
       [ 6.99034593,  7.40277623]])
_

そして、それらは「分類」またはラベル付けされています。これは、リストがあることを意味します

_    labels = np.random.randint(0,3, size = 10)
  # array([2, 0, 1, 2, 2, 1, 1, 0, 1, 2])
_

pointsの各ポイントのラベルを(順番に)表します。

私もいくつかの余分なポイントがあります

_    extraPoints = np.random.uniform(0,10, size = (3,2))
# array([[ 1.91211141,  3.71208978],
#   [ 8.10463536,  1.88948511],
#   [ 9.79796593,  3.39432552]])
_

基本的に、これらの各ポイントがクラスラベルを決定します。ラベルの決定方法は関係ありません。ただし、知っておく必要があるのは、これらの余分なポイントがそれぞれ1つのラベルにのみ関連付けられていることです。したがって、同数のextraPointsとラベルの可能性があります。

問題

散布図をしたいです。 extraPointsの各ポイントに異なる色を割り当てたいので、この色は各クラスに対応します。これは基本的に、_extraPoints[0]_はクラス_0_に関連付けられ、_extraPoints[1]_はクラス_1_に関連付けられ、_extraPoints[2]_はクラス_2_に関連付けられることを意味します。

また、pointsの点を散布図にしたいです。 pointsの各ポイントは、labelsの対応するラベルに関連付けられていることに注意してください。たとえば、_[ 7.35906037, 6.50049804]_はクラス_2_にあり、したがって_extraPoints[2] = [ 9.79796593, 3.39432552]_と同じ色になります。同様に、pointsのポイント_[ 3.21883403, 3.81452312]_は、labelsのクラス_0_に関連付けられているため、_extraPoints[0] = [ 1.91211141, 3.71208978]_と同じ色になります。

マイトライ

plt.scatter()c引数を使用しようとしましたが、それがどのように動作するのかよくわからず、時々動作します。任意..

pointsextraPointsを区別するために、extraPointsを大きくし、透明度を高めます。

_import matplotlib.pyplot as plt
# I scatter the points, and assign c to labels. So hopefully each
# point that ends up in the same label will have the same 
# color? I  think this part is fine, although I am not sure
plt.scatter(points[:,0], points[:,1], c = labels) 
plt.scatter(extraPoints[:,0], extraPoints[:,1], s = 100, alpha = 0.3, c = np.arange(len(extraPoints)))
_

自分で試すことができるように、異なる実行に対して(ランダム配列があるたびに)正しく(またはほぼ)取得するか、タイトルにエラーが表示される場合があります。なぜこれが起こるのですか?

追加-勇敢な人のために

このコンテキストを考えると、私もいくつかの値を持っていたと想像してください

_    values = np.random.uniform(0,50, size = 3)
# array([ 14.63459424,  37.41573654,  34.45202082])
_

ラベルとextraPointsのタイプ(この場合は3)と同じ数の値を持っています。現在、これらはそれぞれ、対応するextraPointsに関連付けられています。したがって、最初のextraPointへの最初の値など。

上記のプロットを行いたいのですが、色には「勾配」があります。たとえば、値が小さいほど明るく、値が大きいほど暗くなります(またはその逆)。どうやってやるの?カラーマップについて読みましたが、それを問題と完全に統合することはできません。

たとえば、上記の値の場合、次のように取得します。 scatter

ご覧のとおり、色を制御することはできません。それだけでなく、どのポイントがどのクラスにあるのかわかりません(戻って各ポイントを手動で確認しない限り、明らかにこれは望ましくありません)。これが(そしてここで説明しない他の理由)valuesの値に基づいて色を付けたい理由です。具体的には、ポイントの色を導くことができる値の範囲_[10, 20 30]_を持ちたいので、どのクラスが「最も強い」かを知ることができます

6
Euler_Salter

最初の問題np.random.uniform(0,10, size = 3)は1D配列を与えるため、コードは実行されませんが、後で2D(_extraPoints[:,0]_)。

2番目の問題labelsには1〜3個の一意のエントリがあるため、np.unique(labels)の長さは1〜 3(たとえば、labelsはすべてゼロで、np.unique(labels) == [0]など)、色よりもポイントが多い場合。ただし、cは、単一の色引数、または入力座標と同じ長さの値のリストのいずれかを想定しています。

3番目の問題:長さ3または4のリストまたは配列を提供する場合、これが単一のRGBまたはRGBAカラーまたはリストのどちらであるかが明確ではないカラーマップへの値。実際にこの問題に遭遇したかどうかは、最初と2番目の問題を解決するまではっきりとは言えません。

更新:最初の2つの問題が解決した後は、おそらくカラーバーと便利なカラーマップを探しているだけです。

_import numpy as np
import matplotlib.pyplot as plt
import matplotlib.colors

points = np.random.uniform(0,10, size = (10,2))

labels = np.random.randint(0,3, size = 10)

extraPoints = np.random.uniform(0,10, size = (3,2))

sc = plt.scatter(points[:,0], points[:,1], c = labels) 
sc2 = plt.scatter(extraPoints[:,0], extraPoints[:,1], s = 144, alpha = 0.7, 
            c = np.arange(len(extraPoints)))

plt.colorbar(sc)

plt.show()
_

enter image description here

または、個別の色にしたい場合:

_import numpy as np
import matplotlib.pyplot as plt
import matplotlib.colors

points = np.random.uniform(0,10, size = (10,2))

labels = np.random.randint(0,3, size = 10)

extraPoints = np.random.uniform(0,10, size = (3,2))

colors=["red", "gold", "limegreen"]
cmap = matplotlib.colors.ListedColormap(colors)

sc = plt.scatter(points[:,0], points[:,1], c = labels, cmap=cmap, vmin=-0.5,vmax=2.5 ) 
sc2 = plt.scatter(extraPoints[:,0], extraPoints[:,1], s = 144, alpha = 0.7, 
            c = np.arange(len(extraPoints)), cmap=cmap, vmin=-0.5,vmax=2.5)

plt.colorbar(sc, ticks=np.arange(len(extraPoints)))

plt.show()
_

enter image description here

ImportanceOfBeingErnestのおかげで、問題を解決できました。私の説明が本当に悪かったのは知っていますが、ここで、将来同じ問題を見つけるかもしれない誰かのためにそれを投稿します。

ImportanceOfBeingErnestソリューション

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.colors

points = np.random.uniform(0,10, size = (10,2))

labels = np.random.randint(0,3, size = 10)

extraPoints = np.random.uniform(0,10, size = (3,2))

colors=["red", "gold", "limegreen"]
cmap = matplotlib.colors.ListedColormap(colors)

sc = plt.scatter(points[:,0], points[:,1], c = labels, cmap=cmap, vmin=-0.5,vmax=2.5 ) 
sc2 = plt.scatter(extraPoints[:,0], extraPoints[:,1], s = 144, alpha = 0.7, 
            c = np.arange(len(extraPoints)), cmap=cmap, vmin=-0.5,vmax=2.5)

plt.colorbar(sc, ticks=np.arange(len(extraPoints)))

plt.show()

必要なことを行うアドイン

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.colors

points = np.random.uniform(0,10, size = (10,2))

labels = np.random.randint(0,3, size = 10)

extraPoints = np.random.uniform(0,10, size = (3,2))
# CREATE VALUES
values = np.random.uniform(0,50, size=3)

colors=["red", "gold", "limegreen"]
cmap = matplotlib.colors.ListedColormap(colors)

sc = plt.scatter(points[:,0], points[:,1], c = np.array([values[j] for j in labels]), cmap=cmap, vmin=-0.5,vmax=2.5 ) 
sc2 = plt.scatter(extraPoints[:,0], extraPoints[:,1], s = 144, alpha = 0.7, 
            c = values, cmap=cmap, vmin=-0.5,vmax=2.5)

plt.colorbar(sc, ticks=np.arange(len(extraPoints)))

plt.show()

違いは、scの色がvaluesの値によってlabelsと同じ順序で決定されると同時に、extraPointsのポイントによって決定されることです。 valuesの値の強度と順序で色付けされています。

0
Euler_Salter