2017-02-05 13 views
1

私は散布図の凡例をプロットすることに興味があります。私の現在のコードは、このmatplotlib scatterplot with legend

x=[1,2,3,4] 
y=[5,6,7,8] 
classes = [2,4,4,2] 
plt.scatter(x, y, c=classes, label=classes) 
plt.legend() 

のように見える問題は、プロットが作成されたときに、伝説ではなく独自のラベルとそのクラスを示すの配列として示されていることです。

This is how the plot looks

私はこれは、このoneなどのスレッドで先に述べた質問です承知しています、しかし、私は私の問題がさらに簡単で、そこに解決策がそれに適合しないことを感じます。また、その例では、人が色を指定していますが、私の場合は、必要な色数を事前に知っています。さらに、thisの例では、ユーザーはそれぞれ独自の色を持つ複数の散布図を作成しています。繰り返しますが、これは私が望むものではありません。私の目標は、x、y配列とラベルを使ってプロットを作成することです。これは可能ですか?

ありがとうございました。

答えて

4

実際には、リンクされた両方の質問が、望ましい結果を達成する方法を提供します。

一番簡単な方法は、一意のクラスが存在する数の分散プロットを作成し、それぞれに単一の色と凡例のエントリを与えることです。

import matplotlib.pyplot as plt 

x=[1,2,3,4] 
y=[5,6,7,8] 
classes = [2,4,4,2] 
unique = list(set(classes)) 
colors = [plt.cm.jet(float(i)/max(unique)) for i in unique] 
for i, u in enumerate(unique): 
    xi = [x[j] for j in range(len(x)) if classes[j] == u] 
    yi = [y[j] for j in range(len(x)) if classes[j] == u] 
    plt.scatter(xi, yi, c=colors[i], label=str(u)) 
plt.legend() 

plt.show() 

enter image description here

+0

あなたの答えは私が望んでいたプロットを作成するために私を助けました。ありがとう。 – user3276768

+1

これを行う方法がないというのは驚くべきことだと私は唯一の人ですか?私は、異なるクラスのポイントの分布をプロットするのはとても普通の仕事です。理由を知っているなら、私に教えてください。 – Johannes

+0

@Johannes「組み込み」をしたいのはどういうことですか?これはプロットか伝説か? – ImportanceOfBeingErnest

3

たぶん手動tableを充填することは、ここに有用である可能性があります。あなたのクラスが連続した番号である場合、別の考え方はcolorbarを使用しています。私は両方のアプローチを1つに示しています。

x=[1,2,3,4,5,6,7] 
y=[1,2,3,4,5,6,7] 
classes = [2,4,4,2,1,3,5] 
cmap = cm.get_cmap("viridis",5) 
plt.scatter(x, y, c=classes, label=classes,cmap=cmap,vmin=0.5,vmax=5.5) 
plt.colorbar() 
unique_classes = list(set(classes)) 
plt.table(cellText=[[x] for x in unique_classes], loc='lower right', 
      colWidths=[0.2],rowColours=cmap(np.array(unique_classes)-1), 
     rowLabels=['label%d'%x for x in unique_classes], 
      colLabels=['classes']) 

enter image description here

+1

良いアイデア!カラーマップだけがちょっとハッキリです。 – ImportanceOfBeingErnest

+1

はい、いくつかの微調整が必​​要で、データにその間隔内のすべての数値がある場合にのみ適用されます。 –