2012-02-15 18 views

Trả lời

31

Khi thiết lập các xlabel, tham số x gán vị trí trong đơn vị trục, do đó 0 là ori gin và 1 là cạnh phải của ô. y bị bỏ qua vì được dự kiến ​​là giá trị mặc định, ngay bên dưới dấu tick.

Để ghi đè hành vi này, bạn có thể đặt vị trí theo đơn vị trục bằng cách sử dụng Axisset_label_coordsmethod. Bạn có thể sử dụng các đơn vị khác bằng cách cung cấp một biến đổi.

Dưới đây là một ví dụ về điều này:

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

Hệ quả là: enter image description here

Giá trị x (1,05) đã được lựa chọn để định vị nhãn bên ngoài khung Axes. Giá trị y (-0.025) đã được chọn là phỏng đoán tốt nhất cho vị trí bạn muốn. Sử dụng phép biến đổi, có thể tự động định vị văn bản phù hợp với nhãn Tick.

EDIT:

Dưới đây là một ví dụ mở rộng sử dụng một biến đổi. Nó không phải là hữu ích hơn để sử dụng biến đổi của ticklabel cuối cùng, bởi vì nó không tính đến kích thước của văn bản và cách nó được căn chỉnh. Vì vậy, để có được hiệu ứng mong muốn, tôi phải 1) sử dụng cùng kích thước phông chữ cho nhãn x của tôi, 2) đặt căn chỉnh dọc (va) đến 'trên cùng' và 3) đặt căn chỉnh theo chiều ngang sang 'trái'. Biến đổi cho mỗi đánh dấu được thiết lập cho các đơn vị dữ liệu cho x (vì nó là một xaxis) và các đơn vị trục cho y (0 đến 1), nhưng thay thế bởi một padding cố định (tính bằng pixel) từ trục 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() 

Điều này dẫn đến:

enter image description here

+1

Bạn có thể đưa ra ví dụ về việc sử dụng biến đổi không? –

+1

@Zhenya Tôi đã thêm một ví dụ, nhưng hóa ra không phải là tầm thường. – Yann

+0

cảm ơn bạn rất nhiều! – billyduc

15

Ngoài những gì @Yann đã nói, nó thực sự dễ dàng hơn để làm điều này với annotate. Nó cũng sẽ ở đúng vị trí khi phóng to/thu nhỏ.

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

cảm ơn câu trả lời của bạn Joe – billyduc

3

Đây là biến thể của tôi sử dụng phương pháp @JoeKington. Tôi thay đổi nhãn đánh dấu cuối cùng thành tên trục. Đầu tiên tôi đặt ve cuối cùng cho chuỗi rỗng và sau đó sử dụng chú thích(). Tôi đã sử dụng chú thích() vì tôi cần điều khiển kích thước phông chữ của nhãn trục.

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) 

Có thể ai đó biết cách thanh lịch hơn để làm điều này, bởi vì nó hoạt động phức tạp.

enter image description here

-1

Đối với những người mà muốn đặt tên axises và đang sử dụng trực tiếp plt và không phải một số ax cũng không 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() 

Để thêm vào ví dụ demo này, đây là một số ví dụ thực tế: https://github.com/guillaume-chevalier/LSTM-Human-Activity-Recognition

+0

Điều này không xác định nhãn ở cuối trục. – jinawee

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