Стилизация части метки в легенде в matplotlib

Можно ли выделить часть текста легенды в определенном стиле, скажем, жирным или курсивом?


person englebip    schedule 04.12.2011    source источник
comment
Вы пробовали, работает ли текс-форматирование для легенды?   -  person silvado    schedule 05.12.2011


Ответы (3)


Как отмечает Сильвадо в своем комментарии, вы можете использовать рендеринг LaTeX для более гибкого управления рендерингом текста. См. здесь для получения дополнительной информации: http://matplotlib.org/users/usetex.html

Пример:

import numpy as np
import matplotlib.pyplot as plt
from matplotlib import rc

# activate latex text rendering
rc('text', usetex=True)

x = np.arange(10)
y = np.random.random(10)
z = np.random.random(10)

fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot(x, y, label = r"This is \textbf{line 1}")
ax.plot(x, z, label = r"This is \textit{line 2}")
ax.legend()
plt.show()

введите здесь описание изображения

Обратите внимание на букву «r» перед строками меток. Из-за этого \ будет рассматриваться как латексная команда, а не интерпретироваться как python (поэтому вы можете ввести \textbf вместо \\textbf).

person joris    schedule 05.12.2011
comment
Спасибо, это именно то, что я искал! На случай, если это поможет кому-то еще, у меня были проблемы с запуском примера кода в Ubuntu 11.10, пока я не установил пакеты texlive (у меня был texlive-base) и texlive-latex-extra. - person englebip; 05.12.2011
comment
В Ubuntu 12.04 мне понадобились texlive, texlive-latex-extra и dvipng, чтобы этот пример заработал. - person Ulrich Stern; 18.04.2016
comment
В последней версии Ubuntu 19.10 также потребуется cm-super; Таким образом, весь список необходимых пакетов будет следующим в одной команде установки: sudo apt-get install dvipng texlive-latex-extra texlive-fonts-recommended cm-super - person kmario23; 31.05.2020

Напишите между «$$», чтобы заставить matplotlib интерпретировать его.

import matplotlib.pyplot as plt

plt.plot(range(10), range(10), label = "Normal text $\it{Italics}$")
plt.legend()
plt.show()
person Homayoun Hamedmoghadam-Rafati    schedule 01.11.2016
comment
Это действительно намного проще, чем принятый ответ, и не требует установки латекса. Для полужирного текста используйте \bf вместо \it. - person ImportanceOfBeingErnest; 23.05.2017
comment
@homayoun работает нормально, а \bf нет. У меня есть ссылка на документацию, где? какие еще\ручки есть? - person dmeu; 07.06.2017
comment
Вот некоторая документация по синтаксису $...$: matplotlib.org/users/mathtext.html - person ; 27.06.2017
comment
@dmeu для полужирного шрифта должно быть \\bf (двойная косая черта) - person Claudiu Creanga; 27.10.2017
comment
Не работает для предложений: исчезают пробелы между словами, так как эта функция предназначена для математики, а не для текста. Вам придется выделять жирным шрифтом/курсивом каждое слово отдельно. - person Åsmund; 19.03.2018
comment
Вы можете сделать что-то вроде этого, чтобы сохранить пробелы: 'Normal text' + ' '.join(['$\it{'+i+'}$' for i in my_label.split(' ')]), где my_label — это метка, которую вы хотите выделить курсивом. - person ignoring_gravity; 11.09.2018
comment
используйте \ (обратная косая черта), чтобы вставить пробел в математическом режиме. $это\ есть\ слова$. $\mathrm{whatever}$ тоже полезно знать. - person travc; 09.04.2019

Добавление дополнительных параметров к ответу выше путем устранения проблем с этим ответом, с интерфейсом OO, а не только интерфейс pyplot на основе состояния, возможность использовать пробелы как часть текста, параметр полужирный в дополнение к курсиву:

ax.legend(handles=legend_handles,
          labels=legend_labels,
          loc='upper right',
          shadow=True,
          fancybox=True,
          facecolor='#C19A6B',
          title="$\\bf{BOLDFACED\ TITLE}$",     # to boldface title with space in between
          prop={'size': 12, 'style': 'italic'}  # properties for legend text
         )

Для выделенного курсивом заголовка с пробелом между ними замените указанный выше title на,

 title="$\\it{ITALICIZED\ TITLE}$",
person kmario23    schedule 30.05.2020