2016-07-19 20 views
4

私はmatplotlibでいくつかのプロットをしていますが、どのセンサーがどのセンサーで記録されたかを視聴者に伝える伝説があります。複数のタイプのセンサーが複数あり、それぞれのグループがどのような種類のセンサーであるかを視聴者に伝えるために、凡例内に字幕を付けたいと思っています。私は実用的なソリューションを持っているが、それはここに示したハックのビットです:凡例マーカーのリスト、および凡例ラベルのリスト:伝説が作成されるとMatplotlibの凡例内の字幕

enter image description here

、それは二つの重要な引数を受け付け。私の現在の解決策は、字幕マーカーを白い輪郭の白いボックスに設定し、サブタイトルのlableを2つの改行文字で囲むことです。申し訳ありませんが、字幕が字下げされていないと、はるかに専門的に見えます。私が試みた2つの回避策は、サブタイトルのマーカーをNoneに設定し、サブタイトルのマーカーを目的のサブタイトルストリングに設定し、そのラベルを空のストリングに設定することでした。どちらもうまくいきませんでした。誰にもこれに関する経験はありますか?本当にありがとう。

+0

これは私が得たものと同じくらいです:http://stackoverflow.com/questions/21570007/custom-legend-in-matplotlib/21571063#21571063 – cphlewis

+0

あなたは手動でsvgを編集すると考えましたか?最後の手段ですが、多くの人がいない限り、プログラマチックな解決策を見つけるよりもはるかに速く行うことができます。 – runDOSrun

答えて

3

私が思いつくのは、文字列のカスタムハンドラを作ることです。

import matplotlib.pyplot as plt 
import matplotlib.text as mtext 


class LegendTitle(object): 
    def __init__(self, text_props=None): 
     self.text_props = text_props or {} 
     super(LegendTitle, self).__init__() 

    def legend_artist(self, legend, orig_handle, fontsize, handlebox): 
     x0, y0 = handlebox.xdescent, handlebox.ydescent 
     title = mtext.Text(x0, y0, r'\underline{' + orig_handle + '}', usetex=True, **self.text_props) 
     handlebox.add_artist(title) 
     return title 


[line1] = plt.plot(range(10)) 
[line2] = plt.plot(range(10, 0, -1), 'o', color='red') 
plt.legend(['Title 1', line1, 'Title 2', line2], ['', 'Line 1', '', 'Line 2'], 
      handler_map={basestring: LegendTitle({'fontsize': 18})}) 

plt.show() 

output

私はhttp://matplotlib.org/users/legend_guide.htmlの例でこれをベース。

+0

私はあなたのソリューションを稼働させることに非常に興奮しています。それはかなり華麗なようです。 RuntimeError:LaTeXは次の文字列を処理できませんでした。 '\\\\ underline {' 何が起こっているのかについてのアイデアはありますか?いいえ、私のマシンで実行しようとするとエラーが発生します。 –

+0

私はr '\ underline {' + orig_handle + '}'をorig_handleに変更し、usetex = Trueを削除することで動作させることができました。下線が引かれていませんが、完全に機能します! –

関連する問題