5

アーティストが文字列(1文字)であり、ラベルが付けられたpython図で凡例を作成しようとしています。たとえば、次の図の凡例が必要です。

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

N = 7
x = np.random.rand(N)
y = np.random.rand(N)
colors = np.random.rand(N)
area = np.pi * (15 * np.random.rand(N))**2 

plt.scatter(x, y, s=area, c=colors, alpha=0.5)
for i,j in enumerate(zip(x,y)):
    plt.annotate(list(string.ascii_uppercase)[i],xy=j)
plt.show()

凡例は次のようなものです。

A - モデル名 A

B - モデル名 B

C - モデル名 C

D - モデル名 D

などなど

どうすればよいか分からないのは、凡例テキストのアーティストとして「A」、「B」、.... を配置することです。ラインやパッチ、または同様のものをどのように使用するかがわかります。しかし、一般的には、線の代わりに文字列をアーティストとして使用する方法はありますか?

4

2 に答える 2

15

テキストの凡例ハンドラーはないと思います (使用可能なもののリストはこちらを参照してください)。ただし、独自のカスタム凡例ハンドラを実装できます。ここでは、上記のリンクの例を変更します。

import matplotlib.pyplot as plt
import matplotlib.text as mpl_text

class AnyObject(object):
    def __init__(self, text, color):
        self.my_text = text
        self.my_color = color

class AnyObjectHandler(object):
    def legend_artist(self, legend, orig_handle, fontsize, handlebox):
        print orig_handle
        x0, y0 = handlebox.xdescent, handlebox.ydescent
        width, height = handlebox.width, handlebox.height
        patch = mpl_text.Text(x=0, y=0, text=orig_handle.my_text, color=orig_handle.my_color, verticalalignment=u'baseline', 
                                horizontalalignment=u'left', multialignment=None, 
                                fontproperties=None, rotation=45, linespacing=None, 
                                rotation_mode=None)
        handlebox.add_artist(patch)
        return patch

obj_0 = AnyObject("A", "purple")
obj_1 = AnyObject("B", "green")

plt.legend([obj_0, obj_1], ['Model Name A', 'Model Name B'],
           handler_map={obj_0:AnyObjectHandler(), obj_1:AnyObjectHandler()})

plt.show()

ここに画像の説明を入力

于 2014-11-27T16:23:36.620 に答える