1. ホーム
  2. python

[解決済み] クラスラベルに応じた Matplotlib の色付け

2023-04-04 20:46:20

質問

2つのベクトルがあります。1つは値で、もう1つは1,2,3などのクラスラベルを持つベクトルです。

私は赤でクラス1、青でクラス2、緑でクラス3などに属するすべての点をプロットしたいと思います。どうすればよいでしょうか。

どのように解決するのですか?

しかし、もしあなたがどのクラスラベルが特定の色やラベルに割り当てられるべきかを指定したいのであれば、次のようにすることができます。私はカラーバーで少しラベルの体操をしましたが、プロット自体を作ることは素敵なワンライナーに還元されます。これは、sklearnで行った分類の結果をプロットするのにとても有効です。各ラベルは(x,y)座標にマッチします。

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

x = [4,8,12,16,1,4,9,16]
y = [1,4,9,16,4,8,12,3]
label = [0,1,2,3,0,1,2,3]
colors = ['red','green','blue','purple']

fig = plt.figure(figsize=(8,8))
plt.scatter(x, y, c=label, cmap=matplotlib.colors.ListedColormap(colors))

cb = plt.colorbar()
loc = np.arange(0,max(label),max(label)/float(len(colors)))
cb.set_ticks(loc)
cb.set_ticklabels(colors)

を少し修正したものを使って この の答えを少し修正すると、N色について上記を次のように一般化することができます。

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

N = 23 # Number of labels

# setup the plot
fig, ax = plt.subplots(1,1, figsize=(6,6))
# define the data
x = np.random.rand(1000)
y = np.random.rand(1000)
tag = np.random.randint(0,N,1000) # Tag each point with a corresponding label    

# define the colormap
cmap = plt.cm.jet
# extract all colors from the .jet map
cmaplist = [cmap(i) for i in range(cmap.N)]
# create the new map
cmap = cmap.from_list('Custom cmap', cmaplist, cmap.N)

# define the bins and normalize
bounds = np.linspace(0,N,N+1)
norm = mpl.colors.BoundaryNorm(bounds, cmap.N)

# make the scatter
scat = ax.scatter(x,y,c=tag,s=np.random.randint(100,500,N),cmap=cmap,     norm=norm)
# create the colorbar
cb = plt.colorbar(scat, spacing='proportional',ticks=bounds)
cb.set_label('Custom cbar')
ax.set_title('Discrete color mappings')
plt.show()

どちらが与えるか。