web-dev-qa-db-fra.com

Légende Matplotlib, ajouter des éléments à travers les colonnes au lieu de bas

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')

enter image description here

27
jbbiomed

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()

enter image description here

25
Avaris

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)
0
SteCrz