Как изменить положение легендарного обработчика в поле легенды в matplotlib - PullRequest
0 голосов
/ 04 ноября 2018

Я пытаюсь сгенерировать пользовательский обработчик легенды в matplotlib с помощью зацикливания данных. Этот обработчик включает в себя изображение и строку, как любезно объяснено здесь (см .: Замените метки легенды Matplotlib изображением ). Я понял, что handler_map всегда обновляет предыдущий обработчик, поэтому я генерирую его после построения линий. Моя проблема в том, что легенда не остается в рамке легенды, а ее части находятся вне коробки. С классом, описанным в ссылке выше, этот фрагмент кода воспроизводит ошибку:

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_clip_on(False)
  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]

def plotting(x_axis, y_axis, fig, color, lineliste, handler_map, legendliste):
 picturepath = path
 ax = fig.add_subplot(111)
 line, =  plt.plot(x_axis,y_axis, c=color)
 lineliste.append(line)
 handler_map[line] = HandlerLineImage(picturepath)
 legendliste.append('')
 return fig, lineliste, handler_map, legendliste


def main():
 fig = plt.figure()
 list_plotting=[[0,1,3,5], [0,0.1,0.2,0.3], [1,5,9,12], [0,1,1,3], [5,5,4,3], [8,7,6,5,]]
 lineliste = []
 legendliste = []
 handler_map = dict()
 plt.xlabel('values')
 colors = iter(cm.nipy_spectral(np.linspace(0, 1, len(list_plotting))))
 cnt_style = 0
 cnt_element = 0
 for element in list_plotting:
  x_values=range(len(element))
  y_values=element
  fig, lineliste, handler_map, legendliste = plotting(x_values, y_values, fig, next(colors), lineliste, handler_map, legendliste)
 plt.legend(handles = lineliste, labels = legendliste, handler_map = handler_map, handlelength=4, labelspacing=0.0, fontsize=36, borderpad=0.1, handletextpad=0.2, borderaxespad=0.1, handleheight=2, loc='upper center', frameon = True, bbox_to_anchor=(1.35,1.1))
 fig.savefig("output.pdf", format='pdf', bbox_inches='tight')
 plt.close(fig)

if __name__=='__main__':
 main()

У меня была идея, что anchored_bbox может вести в правильном направлении, но я не смог понять это. То же самое с AnnotationBbox или идеей, что мне нужно как-то определить BBoxBase, что я также не смог понять. Поскольку я довольно плохо знаком с python / matplotlib, и это кажется необычной / сложной ошибкой, я был бы очень рад, если бы кто-нибудь мог помочь!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...