Căn xticklabels xoay với xticks tương ứng của họ


140

Kiểm tra trục x của hình bên dưới. Làm thế nào tôi có thể di chuyển các nhãn một chút sang trái để chúng thẳng hàng với các dấu tương ứng của chúng?

Tôi đang xoay nhãn bằng cách sử dụng:

ax.set_xticks(xlabels_positions)
ax.set_xticklabels(xlabels, rotation=45)

Nhưng, như bạn có thể thấy, xoay được tập trung ở giữa các nhãn văn bản. Điều này làm cho nó trông giống như họ được chuyển sang bên phải.

Tôi đã thử sử dụng cái này thay thế:

ax.set_xticklabels(xlabels, rotation=45, rotation_mode="anchor")

... nhưng nó không làm những gì tôi muốn. Và "anchor"dường như là giá trị duy nhất được phép cho rotation_modetham số.

Thí dụ

Câu trả lời:


201

Bạn có thể đặt căn chỉnh ngang của ticklabels, xem ví dụ bên dưới. Nếu bạn tưởng tượng một hộp hình chữ nhật xung quanh nhãn xoay, bạn muốn đặt cạnh nào của hình chữ nhật?

Đưa ra mô tả của bạn, bạn muốn: ha = 'đúng'

n=5

x = np.arange(n)
y = np.sin(np.linspace(-3,3,n))
xlabels = ['Ticklabel %i' % i for i in range(n)]

fig, axs = plt.subplots(1,3, figsize=(12,3))

ha = ['right', 'center', 'left']

for n, ax in enumerate(axs):
    ax.plot(x,y, 'o-')
    ax.set_title(ha[n])
    ax.set_xticks(x)
    ax.set_xticklabels(xlabels, rotation=40, ha=ha[n])

nhập mô tả hình ảnh ở đây


15
Bạn cũng có thể sử dụng xlabels = ax.get_xticklabels()nếu bạn chỉ muốn sử dụng các nhãn hiện có.
Ben

Cảm ơn Rutger, đây là một ví dụ tuyệt vời, đã cứu ngày của tôi!
alisa

13

Xoay nhãn là chắc chắn có thể. Lưu ý rằng làm như vậy làm giảm khả năng đọc của văn bản. Một cách khác là thay thế các vị trí nhãn bằng cách sử dụng mã như thế này:

import numpy as np
n=5

x = np.arange(n)
y = np.sin(np.linspace(-3,3,n))
xlabels = ['Long ticklabel %i' % i for i in range(n)]


fig, ax = plt.subplots()
ax.plot(x,y, 'o-')
ax.set_xticks(x)
labels = ax.set_xticklabels(xlabels)
for i, label in enumerate(labels):
    label.set_y(label.get_position()[1] - (i % 2) * 0.075)

nhập mô tả hình ảnh ở đây

Để biết thêm thông tin cơ bản và các lựa chọn thay thế, hãy xem bài đăng này trên blog của tôi


9

Một cách thay thế dễ dàng, không có vòng lặp là sử dụng thuộc tính horizontalalignmentText làm đối số từ khóa cho xticks[1]. Ở bên dưới, tại dòng nhận xét, tôi đã buộc xtickscăn chỉnh là "đúng".

n=5
x = np.arange(n)
y = np.sin(np.linspace(-3,3,n))
xlabels = ['Long ticklabel %i' % i for i in range(n)]
fig, ax = plt.subplots()
ax.plot(x,y, 'o-')

plt.xticks(
        [0,1,2,3,4],
        ["this label extends way past the figure's left boundary",
        "bad motorfinger", "green", "in the age of octopus diplomacy", "x"], 
        rotation=45,
        horizontalalignment="right")    # here
plt.show()

( yticksđã căn chỉnh cạnh phải với dấu kiểm theo mặc định, nhưng đối xticksvới mặc định có vẻ là "trung tâm".)

[1] Bạn thấy rằng được mô tả trong tài liệu xticks nếu bạn tìm kiếm cụm từ " Thuộc tính văn bản".


3

Nếu bạn không muốn sửa đổi nhãn xtick, bạn chỉ có thể sử dụng:

plt.xticks(rotation=45)


3
Nhưng nó có cùng một vấn đề của nhãn liên kết sai. Nhưng, để sử dụng mánh khóe của @RutgierCassies, người ta thực sự có thể sử dụngplt.xticks(rotation=45,ha='right')
Frédéric Grosshans
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.