Ответ @DizietAsahi дает правильный результат для простого примера, но потерпит неудачу для других значений x.Следовательно, можно более широко использовать преобразованный bbox, так что не нужно заботиться о фактических значениях данных.
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,
fig, ax = plt.subplots()
x = np.arange(0,15,0.1)
y = np.sin(x)
plt.plot(x-900,y+1500, label='sine wave')
plt.legend(handler_map={plt.Line2D: HandlerMiniatureLine()})
plt.show()