2017-11-20 4 views
1

から色のマーカーの伝説を作り、私はこのような色の「マーカー」で伝説を作るしようとしている:matplotlibの:matplotlibのスクラッチ

Markers legend

この1つはscatter機能を使用して作られています私のプロットには適応していません。私は関連するデータなしで「ゼロから」伝説を作りたいと思っています。 色は重要なので、各マーカーの属性にする必要があります。

UserWarning: Legend does not support <matplotlib.markers.MarkerStyle object at 0x7fca640c44d0> instances. 
A proxy artist may be used instead. 

:私は警告を受けるMarkerStyleクラスは、色情報

2をサポートしていません

1)):

私は

import matplotlib.markers as mmark 
list_mak = [mmark.MarkerStyle('.'),mmark.MarkerStyle(','),mmark.MarkerStyle('o')] 
list_lab = ['Marker 1','Marker 2','Marker 3'] 

plt.legend(list_mak,list_lab) 

しかしを試してみましたしかし、マーカーに基づいてプロキシアーティストを定義するにはどうすればよいですか?

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

+0

あなたは伝説のガイドを読むことがありますか? https://matplotlib.org/users/legend_guide.html#creating-artists-specifically-for-adding-to-the-legend-aka-proxy-artists – tom

+0

もちろん、「マーカー」の明示的な参照はありません。 legend – Covich

+0

'line2D'オブジェクトを使って青い星を追加する方法を示す例があります。マーカごとに同じ(マーカーなし、ラインなし)を行うことができない理由はありません。 – tom

答えて

2

legend guideに記載されている例に従えば、オブジェクトの代わりにLine2Dオブジェクトを使用できます。

ガイドに与えられた例の唯一の違いは、あなたがあなたが(color, marker)のタプルからハンドラを作成するHandlerBaseをサブクラス化することができlinestyle='None'

import matplotlib.lines as mlines 
import matplotlib.pyplot as plt 

blue_star = mlines.Line2D([], [], color='blue', marker='*', linestyle='None', 
          markersize=10, label='Blue stars') 
red_square = mlines.Line2D([], [], color='red', marker='s', linestyle='None', 
          markersize=10, label='Red squares') 
purple_triangle = mlines.Line2D([], [], color='purple', marker='^', linestyle='None', 
          markersize=10, label='Purple triangles') 

plt.legend(handles=[blue_star, red_square, purple_triangle]) 

plt.show() 

enter image description here

+0

これはいいトリックですが、 "Line2D"と呼ばれるものを使用すると、matplotlibで少し誤解を招く – Covich

+0

です。 "マーカー"は、単に 'plt.plot'や' plt.scatter'関数で使用されるものです。 'plt.plot'は' Line2D'オブジェクトを作成し、 'plt.scatter'は' PathCollection'オブジェクトを作成します。凡例にマーカーが必要な場合は、基本的にこれらの2つのオブジェクトのいずれかを使用する必要があります。私は 'Line2D'がこのケースで扱いやすくなっています。それは「トリック」ではなく、あなたが求めている仕事をする1つの方法です。 – tom

1

を設定したいです。

import matplotlib.pyplot as plt 
from matplotlib.legend_handler import HandlerBase 

list_color = ["c", "gold", "crimson"] 
list_mak = ["d","s","o"] 
list_lab = ['Marker 1','Marker 2','Marker 3'] 

ax = plt.gca() 

class MarkerHandler(HandlerBase): 
    def create_artists(self, legend, tup,xdescent, ydescent, 
         width, height, fontsize,trans): 
     return [plt.Line2D([width/2], [height/2.],ls="", 
         marker=tup[1],color=tup[0], transform=trans)] 


ax.legend(list(zip(list_color,list_mak)), list_lab, 
      handler_map={tuple:MarkerHandler()}) 

plt.show() 

enter image description here