Отметить все линии вертикально
Если цель состоит в том, чтобы обозначить каждую строку в легенде вертикально, а не горизонтально, вы можете обновить дескриптор легенды с помощью 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()
Точная копия в миниатюрном виде
Если цель состоит в том, чтобы получить миниатюрную версию нанесенной линии в легенде, вы в принципе можете использовать этот ответ для Используя миниатюрную версию нанесенных данных в качестве дескриптора легенды . Существует небольшая модификация, необходимая для учета ограничивающего прямоугольника шириной 0, который я теперь также отредактировал в исходном ответе. Здесь это будет выглядеть так:
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()