Pour un graphique simple ci-dessous, existe-t-il un moyen de faire en sorte que matplotlib remplisse la légende de sorte qu'elle remplisse les lignes de gauche à droite, au lieu de la première colonne puis de la seconde colonne?
>>> 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')
Je peux penser à un moyen possible. Vous pouvez commander vos articles de légende comme vous le souhaitez. Tout ce que vous avez à faire est de changer l'ordre pour qu'il vous donne le résultat souhaité.
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()
Par défaut, la légende remplira toutes les colonnes allouées avant d'ajouter une nouvelle ligne. Vous pouvez donc réorganiser les poignées et les étiquettes ensemble pour en tirer parti:
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)