2012-02-15 128 views
26

我希望我的x軸的一端有這樣的格式如何設置我的xlabel在x軸

0 1 2 3 4 5 Xlabel 

的標籤,但我嘗試它下面的代碼導致我在2號線

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

= >我的結果:(

0 1 2 3 4 5 
     Xlabel 

回答

31

當設置xlabel,所述x參數分配在軸單元的位置,所以0是ORI杜松子酒和1是情節的右邊緣。 y被忽略,因爲它預計是一個默認值,正好在刻度線下方。

要覆蓋此行爲,可以使用Axisset_label_coordsmethod以軸爲單位設置位置。您也可以通過提供變換來使用其他單位。

下面是這樣一個例子:

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

在所得: enter image description here

x值(1.05)被選到標籤位置座標軸框架的外側。 y值(-0.025)被選爲您想要的位置的最佳猜測。使用變換,可能會自動將文本放在與Tick標籤一致的位置。

編輯:

下面是使用變換擴展的例子。使用最後一個ticklabel的變換不會更有幫助,因爲它沒有考慮到文本的大小以及它如何對齊。因此,爲了獲得某種期望的效果,我必須1)對我的x標籤使用相同的字體大小,2)將垂直對齊(va)設置爲「頂部」,以及3)將水平對齊設置爲「左」。每個刻度的變換針對x(因爲它是x軸)和y軸(0到1)的軸單位設置爲x的數據單位,但是通過固定填充(以像素爲單位)從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() 

這導致:

enter image description here

+1

你能舉一個使用變換的例子嗎? – 2012-02-15 15:37:12

+1

@ Zhenya我加了一個例子,但事實證明這並不重要。 – Yann 2012-02-15 16:31:55

+0

非常感謝你! – billyduc 2012-02-16 01:52:54

15

除了什麼@Yann已經說過,它實際上是更容易annotate做到這一點。放大/平移時,它也會保持在正確的位置。

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

感謝您的回答Joe – billyduc 2012-02-16 01:52:24

3

這是我使用@JoeKington法的變種。 我將上一個刻度標籤更改爲軸名稱。首先,我將最後一個記號設置爲空字符串,然後使用annotate()。我使用了annotate(),因爲我需要控制軸標籤的字體大小。

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) 

也許有人知道更優雅的方式來做到這一點,因爲它是可笑的複雜的操作。

enter image description here

-1

對於希望命名軸系以及使用直接plt而不是一些ax也不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() 

要添加到該演示的例子,這裏有一些實際的例子:https://github.com/guillaume-chevalier/LSTM-Human-Activity-Recognition

+0

這不會在軸的末端找到標籤。 – jinawee 2017-09-04 23:17:55