2012-02-15 8 views
26

chcę moją oś X ma etykietę jak tego formatuJak ustawić moje xlabel na koniec Xaxis

0 1 2 3 4 5 Xlabel 

ale staram kod poniżej niego doprowadzić mnie w 2 linii

self.axes.set_xticks(np.arange(0,6,1)) 
self.axes.set_xlabel('Xlabel', fontsize=9,x=1,y=1) 

= > mój wynik :(

0 1 2 3 4 5 
     Xlabel 

Odpowiedz

31

Podczas ustawiania xlabel parametr x przyporządkowuje pozycję w jednostkach osi, więc 0 jest ori gin i 1 to prawa krawędź działki. y jest ignorowany, ponieważ oczekuje się, że będzie wartością domyślną, tuż pod znacznikami.

Aby zmienić to zachowanie, można ustawić położenie w jednostkach osi, korzystając z Axismethod. Możesz użyć innych jednostek, również zapewniając transformację.

Oto przykład następująco:

import matplotlib.pyplot as plt 
import numpy as np 

ax = plt.gca() 
ax.set_xticks(np.arange(0,6,1)) 
label = ax.set_xlabel('Xlabel', fontsize = 9) 
ax.xaxis.set_label_coords(1.05, -0.025) 

plt.savefig('labelAtEnd.png') 
plt.show() 

skutki: enter image description here

wartość x (1,05) został wybrany do położenia etykiety na zewnątrz ramy osi. Wartość y (-0,025) została wybrana jako najlepsza domena do pożądanej pozycji. Korzystając z przekształcenia, możliwe jest automatyczne pozycjonowanie tekstu zgodnie z etykietami Tick.

EDIT:

Oto rozszerzony przykład przy użyciu transformacji. Nie jest konieczne użycie ostatniej transformacji znacznika, ponieważ nie uwzględnia ona rozmiaru tekstu i jego wyrównania. Aby uzyskać nieco pożądany efekt, musiałem 1) użyć tego samego rozmiaru czcionki dla mojej etykiety x, 2) ustawić pionowe wyrównanie (va) na "górę", a 3) ustawić poziome wyrównanie na "lewo". Transformacja dla każdego tiku jest ustawiana dla jednostek danych dla x (ponieważ jest to xaxis) i jednostek osi dla y (0 do 1), ale przesunięta przez ustalone wypełnienie (w pikselach) od osi x.

import matplotlib.pyplot as plt 
import numpy as np 

ax = plt.gca() 
ax.set_xticks(np.arange(0,6,1)) 
ax.set_yticks(np.arange(0,6,1)) 
label = ax.set_xlabel('xlabel', ha='left', va = 'top',)#fontsize = 9) 

# need to draw the figure first to position the tick labels 
fig = plt.gcf() 
fig.draw(fig.canvas.get_renderer()) 

# get a tick and will position things next to the last one 
ticklab = ax.xaxis.get_ticklabels()[0] 
trans = ticklab.get_transform() 
ax.xaxis.set_label_coords(5.1, 0, transform=trans) 

plt.savefig('labelAtEnd2.png') 
plt.show() 

Wynika to z:

enter image description here

+1

Czy mógłbyś podać przykład zastosowania transformacji? –

+1

@Zhenya Dodałem przykład, ale okazało się, że nie jest to banalne. – Yann

+0

dziękuję bardzo! – billyduc

15

Oprócz tego, co @Yann już powiedziałem, to rzeczywiście łatwiej to zrobić z annotate. Zostanie również umieszczony we właściwej pozycji po powiększeniu/przesunięciu.

import matplotlib.pyplot as plt 
import matplotlib as mpl 

ticklabelpad = mpl.rcParams['xtick.major.pad'] 

fig, ax = plt.subplots() 
ax.set_xlim([0, 5]) 

# Add the label as annotation. The "5" is the padding betweent the right side 
# of the axis and the label... 
ax.annotate('XLabel', xy=(1,0), xytext=(5, -ticklabelpad), ha='left', va='top', 
      xycoords='axes fraction', textcoords='offset points') 

plt.show() 

enter image description here

+0

dziękuję za odpowiedź Joe – billyduc

3

Oto mój wariant wykorzystania @JoeKington metody. Zmieniam ostatnią etykietę na nazwę osi. Najpierw ustawię ostatnie tiki na puste ciągi, a następnie użyj adnotate(). Użyłem adnotate(), ponieważ potrzebuję kontrolować rozmiar czcionki etykiety osi.

import numpy as np 
import matplotlib.pyplot as plt 

plt.xlim(50, 70) 
plt.ylim(100, 250) 

ax = plt.gca() 
# clears last tick label 
xticks = ax.get_xticks().tolist() 
xticks[-1] = '' 
ax.set_xticklabels(xticks) 
yticks = ax.get_yticks().tolist() 
yticks[-1] = '' 
ax.set_yticklabels(yticks) 
# sets axes labels on both ends 
ax.annotate('$t$', xy=(0.98, 0), ha='left', va='top', xycoords='axes fraction', fontsize=20) 
ax.annotate('$x$', xy=(0, 1), xytext=(-15,2), ha='left', va='top', xycoords='axes fraction', textcoords='offset points', fontsize=20) 

plt.show(block=True) 

Może ktoś zna bardziej elegancki sposób, aby to zrobić, ponieważ jest to absurdalnie skomplikowana operacja.

enter image description here

-1

Dla osób, które chcą wymienić osie i które korzystają bezpośrednio plt a nie jakiś ax ani fig:

plt.figure(figsize=(width, height)) 
plt.plot(x_list, y_list) 
plt.xlabel('x axis name') 
plt.ylabel('y axis name') 
plt.title("Plot's title") 
plt.show() 

Aby dodać do tego przykładu demo, oto kilka praktycznych przykładów: https://github.com/guillaume-chevalier/LSTM-Human-Activity-Recognition

+0

Nie można zlokalizować etykiety na końcu osi. – jinawee

Powiązane problemy