web-dev-qa-db-ja.com

Matplotlib凡例、下にではなく列全体に項目を追加

以下の簡単なプロットの場合、matplotlibが凡例にデータを入力して、最初の列の次に2番目の列ではなく、左から右に行を満たすようにする方法はありますか?

>>> from pylab import *
>>> x = arange(-2*pi, 2*pi, 0.1)
>>> plot(x, sin(x), label='Sine')
>>> plot(x, cos(x), label='Cosine')
>>> plot(x, arctan(x), label='Inverse tan')
>>> legend(loc=9,ncol=2)
>>> grid('on')

enter image description here

32
jbbiomed

考えられる方法が1つ考えられます。 凡例アイテムの順序付け は好きなようにできます。必要なのは、順序を入れ替えて、希望する結果が得られるようにすることだけです。

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

def flip(items, ncol):
    return itertools.chain(*[items[i::ncol] for i in range(ncol)])

x = np.arange(-2*np.pi, 2*np.pi, 0.1)
ax = plt.subplot(111)
ax.plot(x, np.sin(x), label='Sine')
ax.plot(x, np.cos(x), label='Cosine')
ax.plot(x, np.arctan(x), label='Inverse tan')

handles, labels = ax.get_legend_handles_labels()
plt.legend(flip(handles, 2), flip(labels, 2), loc=9, ncol=2)

plt.grid('on')
plt.show()

enter image description here

29
Avaris

デフォルトでは、凡例は、新しい行を追加する前に、割り当てられたすべての列を埋めます。したがって、これを利用するためにハンドルとラベルを一緒に並べ替えることができます。

handles, labels = ax1.get_legend_handles_labels()
handles = np.concatenate((handles[::2],handles[1::2]),axis=0)
labels = np.concatenate((labels[::2],labels[1::2]),axis=0)
0
SteCrz