Разделение названия фигуры в matplotlib
Я использую matplotlib для создания фигуры с 4 суб-графиками в ней.
Я хотел бы разбить одно из моих названий подзадачи, чтобы каждая строка была в центре по отношению к подзаголовку.
Я пробовал
import matplotlib.pylab as plt
fig = plt.figure(num=0,figsize=(8.27, 11.69), dpi=300)
ax = fig.add_subplot(2, 2, 1)
ax.set_title(r'Normalized occupied \\ Neighbors')
и я получаю, что Neighbors
является отступом влево.
Как я могу исправить это?
Ответы
Ответ 1
Я получаю правильное выравнивание, когда я форматирую строку следующим образом:
import matplotlib.pylab as plt
fig = plt.figure()#num=0,figsize=(8.27, 11.69), dpi=300)
ax = fig.add_subplot(2, 2, 1)
ax.set_title('Normalized occupied \n Neighbors')
plt.show()
![enter image description here]()
Ответ 2
Лучшим решением, совместимым с префиксом r
(особенно когда нужно использовать разметку LaTeX), является разделение текста заголовка на две (или несколько частей), например,
import matplotlib.pylab as plt
fig = plt.figure()
plt.title('My Title\n' + r'$\alpha - \omega$ are LaTeX Markup')
plt.plot([1,2,3,4])
plt.show()
Ответ 3
В дополнение к предыдущим ответам, если кто-то хочет автоматизировать операцию, я закодировал функцию, чтобы сделать это легко.
вот он:
def split_title_line(title_text, split_on='(', max_words=5): # , max_words=None):
"""
A function that splits any string based on specific character
(returning it with the string), with maximum number of words on it
"""
split_at = title_text.find (split_on)
ti = title_text
if split_at > 1:
ti = ti.split (split_on)
for i, tx in enumerate (ti[1:]):
ti[i + 1] = split_on + tx
if type (ti) == type ('text'):
ti = [ti]
for j, td in enumerate (ti):
if td.find (split_on) > 0:
pass
else:
tw = td.split ()
t2 = []
for i in range (0, len (tw), max_words):
t2.append (' '.join (tw[i:max_words + i]))
ti[j] = t2
ti = [item for sublist in ti for item in sublist]
ret_tex = []
for j in range (len (ti)):
for i in range(0, len(ti)-1, 2):
if len (ti[i].split()) + len (ti[i+1].split ()) <= max_words:
mrg = " ".join ([ti[i], ti[i+1]])
ti = [mrg] + ti[2:]
break
if len (ti[-2].split ()) + len (ti[-1].split ()) <= max_words:
mrg = " ".join ([ti[-2], ti[-1]])
ti = ti[:-2] + [mrg]
return '\n'.join (ti)
<сильные > Примеры:
В: split_title_line ('Primary school completion (% of girls)')
из
Primary school completion
(% of girls)
В: split_title_line ('Primary school completion in the country as % of girls')
Из:
Primary school completion in the
country as % of girls
Для вопроса о разделении заголовков в matplotlib или около того вы можете добавить этот ax.set_title(split_title_line(r'Normalized occupied Neighbors', max_words=2))
Надеюсь, что все выиграют от этого.
Ответ 4
Я просто хотел бы добавить мои 2 цента: проблема здесь более общая и вращается вокруг правильной вставки новых строк, чтобы разбить текст из одной длинной строки в визуально приятный, эстетичный блок. Следовательно, вот мой вклад, который очень похож на Мухаммеда и просто разбивает строку на куски из 5 слов. Должно быть легко настроить его в соответствии с вашими потребностями (разделитель, длина и т.д.)
def pretty_name(text):
words = text.split("_")
total_string = ""
for counter, word in enumerate(words):
if counter>0 and counter % 5 == 0:
total_string +="\n{}".format(word)
else:
total_string +=" {}".format(word)
return total_string.lstrip()