2011-12-22 27 views
14

Tôi sử dụng matplotlib để tạo hình với 4 ô phụ trong đó.Tách tiêu đề của một hình trong matplotlib

Tôi muốn tách một trong các tiêu đề phụ của tôi, sao cho mỗi dòng sẽ nằm ở trung tâm đối với subplot.

tôi đã cố gắng

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') 

và những gì tôi nhận được là Neighbors là thụt lề sang bên trái.

Tôi làm cách nào để sửa lỗi này?

Trả lời

22

tôi nhận được sự liên kết chính xác khi tôi định dạng chuỗi theo cách này:

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

7

Một giải pháp tốt hơn đó là tương thích với r tiền tố (đặc biệt là khi người ta cần sử dụng đánh dấu LaTeX) là chia văn bản tiêu đề thành hai (hoặc nhiều phần), ví dụ:

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() 
+0

cảm ơn nhận xét của bạn - tôi có thể có 2 dòng trong tiêu đề và thuộc tính riêng biệt cho cả hai không? Chẳng hạn như kích thước phông chữ lớn hơn và in đậm cho dòng trên và bình thường cho phần dưới? – spiff

0

Ngoài các câu trả lời trước, nếu ai đó muốn tự động hóa các hoạt động tôi đã mã hóa một chức năng để làm cho điều này dễ dàng. ở đây là nó:

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) 

Ví dụ:

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

ra:

Primary school completion 
(% of girls) 

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

Primary school completion in the 
country as % of girls 

Đối với câu hỏi của bạn để chia danh hiệu trong matplotlib hoặc lâu hơn, bạn có thể thêm này ax.set_title(split_title_line(r'Normalized occupied Neighbors', max_words=2))

Hy vọng rằng tất cả mọi người được hưởng lợi từ điều này .

Các vấn đề liên quan