コンテキスト
いくつかのポイントがあります
_ 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
引数を使用しようとしましたが、それがどのように動作するのかよくわからず、時々動作します。任意..
points
とextraPoints
を区別するために、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への最初の値など。
上記のプロットを行いたいのですが、色には「勾配」があります。たとえば、値が小さいほど明るく、値が大きいほど暗くなります(またはその逆)。どうやってやるの?カラーマップについて読みましたが、それを問題と完全に統合することはできません。
例
ご覧のとおり、色を制御することはできません。それだけでなく、どのポイントがどのクラスにあるのかわかりません(戻って各ポイントを手動で確認しない限り、明らかにこれは望ましくありません)。これが(そしてここで説明しない他の理由)values
の値に基づいて色を付けたい理由です。具体的には、ポイントの色を導くことができる値の範囲_[10, 20 30]
_を持ちたいので、どのクラスが「最も強い」かを知ることができます
最初の問題: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()
_
または、個別の色にしたい場合:
_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()
_
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
の値の強度と順序で色付けされています。