2013-04-08 22 views
7

Değişken uzunlukta etiketlerim var ve bunları sola hizalamak istiyorum (yani daha kısa olanlarla y ekseni arasında boşluk bırakmak). Bunu yapmanın makul bir yolu var mı? Yatay hizalamayı kullanmak 'sol' onları sola hizalar, ancak hepsi eksende başlar, böylece arsa içine girerler. Yani alternatif bir soru olabilir - başlangıç ​​noktalarını değiştirebilir miyim? gösteri içinMatplotlib: Soldaki y işaretlerini hizalama

Kodu:

import numpy as np 
import matplotlib.pyplot as plt 

ticks = ["Lorem ipsum dolor sit amet, consectetur adipisicin", "g elit, sed do",  "eiusmod tempor incididunt ut labo", "re et dolore magna ali", "qua. Ut en", "im ad minim veniam, quis nostr", "ud exercitation ullamco labo", "ris nisi ut aliquip ex ea c", "ommodo co", "nsequat. Duis aute irure dolor in rep"] 
data = [5,1,2,4,1,4,5,2,1,5] 
ind = np.arange(len(data)) 
fig = plt.figure() 
ax = plt.subplot(111) 
ax.barh(ind, data, 0.999) 
ax.set_yticks(ind + 0.5) 
r = ax.set_yticklabels(ticks)#, ha = 'left') 
fig.set_size_inches(12, 8) 
fig.savefig(r'C:\try.png', bbox_extra_artists=r, bbox_inches='tight') 
+0

+1 kullanışlı örnek kodu için! – tacaswell

cevap

8

Sadece bir pad eklemek gerekir. senin ped ne olması gerektiği endam yapmak için matplotlib ticks position relative to axis

yax = ax.get_yaxis() 
yax.set_tick_params(pad=pad) 

(doc)

Bkz:

import numpy as np 
import matplotlib.pyplot as plt 

ticks = ["Lorem ipsum dolor sit amet, consectetur adipisicin", "g elit, sed do",      "eiusmod tempor incididunt ut labo", "re et dolore magna ali", "qua. Ut en", "im ad minim veniam, quis nostr", "ud exercitation ullamco labo", "ris nisi ut aliquip ex ea c", "ommodo co", "nsequat. Duis aute irure dolor in rep"] 
data = [5,1,2,4,1,4,5,2,1,5] 
ind = np.arange(len(data)) 
fig = plt.figure(tight_layout=True) # need tight_layout to make everything fit 
ax = plt.subplot(111) 
ax.barh(ind, data, 0.999) 
ax.set_yticks(ind + 0.5) 
r = ax.set_yticklabels(ticks, ha = 'left') 
fig.set_size_inches(12, 8, forward=True) 
# re-size first, the shift needs to be in display units 
plt.draw() # this is needed because get_window_extent needs a renderer to work 
yax = ax.get_yaxis() 
# find the maximum width of the label on the major ticks 
pad = max(T.label.get_window_extent().width for T in yax.majorTicks) 

yax.set_tick_params(pad=pad) 
plt.draw() 

demo of code

+0

İşaretçi için teşekkürler. Ama bu "sadece" değil Bunun çalışması için en büyük kene noktalarında boyutu almak için bir yol bulmalıyım ... bu konuda herhangi bir ipucu? – Korem

+0

@TalKremerman (mpl perspektifinden) tartışacağım. Başlangıç ​​noktalarının nasıl değiştirileceğini sormuştunuz, bu başlangıç ​​noktasının ne olacağını belirlemek için bir yol değil;) – tacaswell

+0

Harika örnek. Diğer amaçlar için de benim için çok yararlı olacak. Teşekkürler – Korem