Marquez toutes les lignes verticalement
Si l'objectif est de faire en sorte que chaque ligne soit marquée verticalement plutôt qu'horizontalement dans la légende, vous pouvez mettre à jour le gestionnaire de la légende via la commande handler_map
.
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.legend_handler import HandlerLine2D
plt.plot([1,3,2], label='something')
plt.plot([.5,.5], [1,3], label='something else')
def update_prop(handle, orig):
handle.update_from(orig)
x,y = handle.get_data()
handle.set_data([np.mean(x)]*2, [0, 2*y[0]])
plt.legend(handler_map={plt.Line2D:HandlerLine2D(update_func=update_prop)})
plt.show()
Reproduire la ligne en miniature
Si l'objectif est d'obtenir une version miniature de la ligne tracée dans la légende, vous pouvez en principe utiliser cette réponse pour Utilisation d'une version miniature des données tracées comme poignée de légende . Une légère modification est cependant nécessaire pour tenir compte d'une boîte de délimitation dont la largeur peut être nulle, que j'ai également modifiée dans la réponse originale. Ici, cela ressemblerait à :
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.legend_handler import HandlerLine2D
import matplotlib.path as mpath
from matplotlib.transforms import BboxTransformFrom, BboxTransformTo, Bbox
class HandlerMiniatureLine(HandlerLine2D):
def create_artists(self, legend, orig_handle,
xdescent, ydescent, width, height, fontsize,
trans):
legline, _ = HandlerLine2D.create_artists(self,legend, orig_handle,
xdescent, ydescent, width, height, fontsize, trans)
legline.set_data(*orig_handle.get_data())
ext = mpath.get_paths_extents([orig_handle.get_path()])
if ext.width == 0:
ext.x0 -= 0.1
ext.x1 += 0.1
bbox0 = BboxTransformFrom(ext)
bbox1 = BboxTransformTo(Bbox.from_bounds(xdescent, ydescent, width, height))
legline.set_transform(bbox0 + bbox1 + trans)
return legline,
plt.plot([1,3,2], label='something')
plt.plot([.5,.5], [1,3], label='something else')
plt.legend(handler_map={plt.Line2D:HandlerMiniatureLine()})
plt.show()