разделить заголовок фигуры в матплотлибе - PullRequest
28 голосов
/ 22 декабря 2011

Я использую matplotlib для создания фигуры с четырьмя вложенными участками.

Я хотел бы разделить один из моих заголовков вспомогательного сюжета так, чтобы каждая строка была в центре по отношению к вспомогательному участку..

Я пытался

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 имеет отступ слева.

Как я могу исправить это?

Ответы [ 4 ]

40 голосов
/ 22 декабря 2011

Я получаю правильное выравнивание, когда форматирую строку следующим образом:

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

12 голосов
/ 20 июня 2016

Лучшее решение, которое совместимо с префиксом 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()
1 голос
/ 10 января 2018

В дополнение к предыдущим ответам, если кто-то хочет автоматизировать операцию, я написал функцию, которая облегчит эту задачу.вот оно:

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)

Примеры:

In : split_title_line ('Primary school completion (% of girls)')

out:

Primary school completion 
(% of girls)

In: split_title_line ('Primary school completion in the country as % of girls') Out:

Primary school completion in the
country as % of girls

Если вы хотите разделить заголовки в matplotlib или около того, вы можете добавить это ax.set_title(split_title_line(r'Normalized occupied Neighbors', max_words=2))

Надеюсь, что все выиграют от этого.

0 голосов
/ 18 июня 2019

Хотелось бы просто добавить мои 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()


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