2016-07-19 4 views
4

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

enter image description here

Когда создается легенда, она принимает два важных аргумента: список маркеров легенды, и список условных обозначений этикетки , Мое текущее решение заключается в том, чтобы установить маркер субтитров как белую рамку с белым контуром, а лабиринт субтитров должен быть окружен двумя символами новой строки. Это выглядит хорошо, но было бы гораздо более профессионально, если бы субтитры не были отступом. Два обходных решения, которые я пытался, устанавливали маркер субтитров None, а также установку маркера субтитров на нужную строку субтитров и ее метку на пустую строку. Ничего не сработало. У кого-нибудь есть опыт? Спасибо.

+0

Это так близко, как я получил: http://stackoverflow.com/questions/21570007/custom-legend-in-matplotlib/21571063#21571063 – cphlewis

+0

Рассматривали ли вы вручную редактирование svg? Это последнее средство, но если у вас много цифр, вы можете сделать это намного быстрее, чем найти программное решение. – runDOSrun

ответ

3

Лучшее, что я мог придумать, - создать пользовательский обработчик для строки.

import matplotlib.pyplot as plt 
import matplotlib.text as mtext 


class LegendTitle(object): 
    def __init__(self, text_props=None): 
     self.text_props = text_props or {} 
     super(LegendTitle, self).__init__() 

    def legend_artist(self, legend, orig_handle, fontsize, handlebox): 
     x0, y0 = handlebox.xdescent, handlebox.ydescent 
     title = mtext.Text(x0, y0, r'\underline{' + orig_handle + '}', usetex=True, **self.text_props) 
     handlebox.add_artist(title) 
     return title 


[line1] = plt.plot(range(10)) 
[line2] = plt.plot(range(10, 0, -1), 'o', color='red') 
plt.legend(['Title 1', line1, 'Title 2', line2], ['', 'Line 1', '', 'Line 2'], 
      handler_map={basestring: LegendTitle({'fontsize': 18})}) 

plt.show() 

output

я на основе этого на примере в http://matplotlib.org/users/legend_guide.html.

+0

Я очень рад, что вы заработали свое решение; это кажется довольно блестящим. К сожалению, когда я пытаюсь запустить его на своей машине, он вызывает ошибку: RuntimeError: LaTeX не смог обработать следующую строку: '\\\\ underline {' Любые идеи о том, что происходит? –

+0

Я смог заставить его работать, изменив r '\ underline {' + orig_handle + '}' на orig_handle, а также удалив usetex = True. Это не подчеркивается, но он полностью работает! –

Смежные вопросы