2017-02-10 3 views
2

Я хотел бы использовать изображение вместо меток в легенде.Замените этикетки легенд Matplotlib с изображением

Например, я рисую 2 строки и показать легенду:

import matplotlib.pyplot as plt 
plt.plot([1,2],label="first_image") 
plt.plot([2,1],label="second_image") 
plt.legend() 
plot.show() 

What I have now

Но я хотел бы иметь что-то вроде этого:

The result I need

Заметьте, что это не является дубликатом Insert image in matplotlib legend, Моя проблема заключается в «изменении метки на изображение», , а другой - «изменить символ легенды на изображение»

+0

Возможный дубликат [Вставка изображения в Matplotlib легенды] (http://stackoverflow.com/questions/26029592/insert-image-in-matplotlib-legend) – Chuck

+1

не непосредственно связаны между собой, но этот пример может привести вас в правильном направлении: http://matplotlib.org/examples/pylab_examples/demo_annotation_box.html – tom

ответ

2

Концепция создания изображения в легенде уже представлена ​​в этом вопросе (Insert image in matplotlib legend), где изображение используется как художник для записи легенды.

Если вам нужна ручка линии и изображение в легенде, идея состоит в том, чтобы создать дескриптор, состоящий из обоих из них, расположенных рядом друг с другом. Единственная проблема заключается в том, чтобы точно настроить параметры таким образом, чтобы это выглядело привлекательно.

import matplotlib.pyplot as plt 
import matplotlib.lines 
from matplotlib.transforms import Bbox, TransformedBbox 
from matplotlib.legend_handler import HandlerBase 
from matplotlib.image import BboxImage 

class HandlerLineImage(HandlerBase): 

    def __init__(self, path, space=15, offset = 10): 
     self.space=space 
     self.offset=offset 
     self.image_data = plt.imread(path)   
     super(HandlerLineImage, self).__init__() 

    def create_artists(self, legend, orig_handle, 
         xdescent, ydescent, width, height, fontsize, trans): 

     l = matplotlib.lines.Line2D([xdescent+self.offset,xdescent+(width-self.space)/3.+self.offset], 
            [ydescent+height/2., ydescent+height/2.]) 
     l.update_from(orig_handle) 
     l.set_transform(trans) 

     bb = Bbox.from_bounds(xdescent +(width+self.space)/3.+self.offset, 
           ydescent, 
           height*self.image_data.shape[1]/self.image_data.shape[0], 
           height) 

     tbb = TransformedBbox(bb, trans) 
     image = BboxImage(tbb) 
     image.set_data(self.image_data) 

     self.update_prop(image, orig_handle, legend) 
     return [l,image] 


plt.figure(figsize=(4.8,3.2)) 
line, = plt.plot([1,2],[1.5,3], color="#1f66e0", lw=1.3) 
line2, = plt.plot([1,2],[1,2], color="#efe400", lw=1.3) 
plt.ylabel("Flower power") 

plt.legend([line, line2], ["", ""], 
    handler_map={ line: HandlerLineImage("icon1.png"), line2: HandlerLineImage("icon2.png")}, 
    handlelength=2, labelspacing=0.0, fontsize=36, borderpad=0.15, loc=2, 
    handletextpad=0.2, borderaxespad=0.15) 

plt.show() 

enter image description here

+0

Большое спасибо! Это работает как шарм! – Drico