matplotlib chia sẻ trục x nhưng không hiển thị nhãn đánh dấu trục x cho cả hai, chỉ một


80

Tôi đang sử dụng python + matplotlib và tôi có hai mảnh đất chia sẻ một trục. Nếu bạn cố gắng thiết lập graph1.set_xticklabels([])trong khi chia sẻ một trục, nó không có tác dụng vì nó được chia sẻ. Có cách nào để chia sẻ trục VÀ có thể ẩn trục x của một ô không?

Câu trả lời:


115

Đây là lỗi chung khi sử dụng các trục chia sẻ.

May mắn thay, có một cách khắc phục đơn giản: sử dụng plt.setp(ax.get_xticklabels(), visible=False)để làm cho các nhãn ẩn chỉ trên một trục.

Điều này tương đương [label.set_visible(False) for label in ax.get_xticklabels()]với bất cứ giá trị nào của nó. setpsẽ tự động hoạt động trên một đối tượng matplotlib có thể lặp lại, cũng như các đối tượng riêng lẻ.

Ví dụ:

import matplotlib.pyplot as plt
fig = plt.figure()
ax1 = fig.add_subplot(2,1,1)
ax1.plot(range(10), 'b-')

ax2 = fig.add_subplot(2,1,2, sharex=ax1)
ax2.plot(range(10), 'r-')

plt.setp(ax1.get_xticklabels(), visible=False)

plt.show()

văn bản thay thế


8
Tôi đã gặp phải vấn đề ngược: Các nhãn trên ô phụ thứ hai sẽ không hiển thị. vì vậy tôi sử dụng lệnh như dưới đây: plt.setp(ax2.get_yticklabels(), visible=True). Làm việc hoàn hảo.
n1000

49

Theo một chủ đề trên matplotlib-users , bạn có thể sử dụng

import matplotlib.pyplot as plt
for ax in plt.gcf().axes:
    try:
        ax.label_outer()
    except:
        pass

1
Tôi ước mình có thể ủng hộ điều này nhiều hơn, vì nó hữu ích hơn câu trả lời được chấp nhận. Tình huống duy nhất mà bạn muốn sửa đổi khả năng hiển thị thay vì chỉ loại bỏ chúng là trên các ô con; và câu trả lời của bạn thông minh hơn nhiều trong trường hợp đó. Cảm ơn!
Channing Moore

Tại sao trycần thiết? Nó có vẻ ổn mà không có nó.
EL_DON

1
trylà cần thiết vì không phải tất cả các phần tử của plt.gcf().axesdanh sách đều được đảm bảo là các subplotcá thể (với một label_outerphương thức).
tránh

16

Bạn có thể sử dụng Axes.tick_params () :

import matplotlib.pyplot as plt

fig = plt.figure()
ax1 = fig.add_subplot(211)
ax2 = fig.add_subplot(212, sharex=ax1)

ax1.tick_params(labelbottom=False)

Đặt labelbottom = True đã giải quyết được điều đó cho tôi trong trường hợp ngược lại. Cảm ơn.
mclzc

Cũng phù hợp với tôi trong trường hợp ngược lại, trong khi plt.setp (ax [1] .get_yticklabels (), display = True) thì không.
deckard

5

Bạn có thể chia sẻ các trục trong âm mưu phụ tạo với plt.subplotsnhư

fig, axes = plt.subplots(nrows=2, sharex=True)

Thao tác này sẽ tự động tắt các nhãn đánh dấu cho các trục bên trong.

Toàn bộ ví dụ:

import matplotlib.pyplot as plt

fig, axes = plt.subplots(nrows=2, sharex=True)

axes[0].plot([1,2,3])
axes[1].plot([3,2,1])

plt.show()

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


nhưng nếu bạn cố gắng để di chuyển con ve sang phía bên kia của cốt truyện, các nhãn trở lại: /
endolith

Đúng vậy, trong trường hợp đặc biệt đó, bạn cần đặt chúng ở chế độ ẩn một lần nữa.
Tầm quan

label_outer()dường như công việc stackoverflow.com/a/12751192/125507
endolith

Vâng, tất cả các câu trả lời ở đây trả lời câu hỏi !?
Tầm quan

0

Thật không may, tôi không được phép nhận xét về câu trả lời của esmit (đó là giải pháp tốt nhất theo ý kiến ​​của tôi, cảm ơn esmit), vì vậy tôi phải viết nhận xét của mình như một câu trả lời mới: Tôi đặt giải pháp của anh ấy thành một hàm đơn giản

def remove_inner_ticklabels(fig):
    for ax in fig.axes:
        try:
            ax.label_outer()
        except:
            pass

mà bạn có thể gọi trước đây plt.show(). Câu trả lời của Joe Kington không phù hợp với tôi vì một số lý do.

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.