Làm thế nào tôi có thể loại bỏ trục trên và bên phải trong matplotlib?


133

Thay vì kiểu trục "đóng hộp" mặc định, tôi muốn chỉ có trục trái và trục dưới, nghĩa là:

+------+         |
|      |         |
|      |   --->  |
|      |         |
+------+         +-------

Điều này sẽ dễ dàng, nhưng tôi không thể tìm thấy các tùy chọn cần thiết trong tài liệu.

Câu trả lời:


153

Đây là giải pháp Matplotlib 3 được đề xuất từ ​​trang web chính thức TẠI ĐÂY :

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(0, 2*np.pi, 100)
y = np.sin(x)

ax = plt.subplot(111)
ax.plot(x, y)

# Hide the right and top spines
ax.spines['right'].set_visible(False)
ax.spines['top'].set_visible(False)

# Only show ticks on the left and bottom spines
ax.yaxis.set_ticks_position('left')
ax.xaxis.set_ticks_position('bottom')

plt.show()

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


2
Đây là câu trả lời tốt hơn câu trả lời được chấp nhận trong các phiên bản mới hơn của matplotlib.
ffledgling

3
Câu hỏi bổ sung cho người mới bắt đầu: bạn có thể tìm thấy câu trả lời này dựa trên tài liệu API Matplotlib ở đâu? Nếu tôi đến đó: matplotlib.org/api/axes_api.html Tôi không thấy bất kỳ tài liệu tham khảo nào về spineđối tượng và tôi sẽ không đoán được từ khóa này.
Eric Burel

63

Ngoài ra, cái này

def simpleaxis(ax):
    ax.spines['top'].set_visible(False)
    ax.spines['right'].set_visible(False)
    ax.get_xaxis().tick_bottom()
    ax.get_yaxis().tick_left()

dường như đạt được hiệu ứng tương tự trên một trục mà không mất hỗ trợ nhãn xoay.

(Matplotlib 1.0.1; giải pháp lấy cảm hứng từ điều này ).


33

[sửa] matplotlib ngay bây giờ (2013-10) trên phiên bản 1.3.0 bao gồm điều này

Khả năng đó thực sự vừa được thêm vào, và bạn cần phiên bản Subversion cho nó. Bạn có thể xem mã ví dụ ở đây .

Tôi chỉ đang cập nhật để nói rằng có một ví dụ tốt hơn trực tuyến bây giờ. Vẫn cần phiên bản Subversion, chưa có bản phát hành nào.

[sửa] Matplotlib 0.99.0 RC1 vừa được phát hành và bao gồm khả năng này.


Hãy chắc chắn rằng bạn đã đọc cảnh báo tại matplotlib.sourceforge.net/mpl_toolkits/axes_grid/users/ trộm về hỗ trợ đánh dấu không đầy đủ trước khi bạn thử và sử dụng ở trên với các nhãn được xoay như vậy!
timday

Có vẻ như nó phụ thuộc vào cách bạn xây dựng trục. Các trục tạo ra mpl.subplotskhông thể được sử dụng theo cách này?
Stefan van der Walt

8
Liên kết ví dụ bây giờ bị hỏng.
mkosmala

10

(Đây là nhiều hơn một nhận xét mở rộng, ngoài các câu trả lời toàn diện ở đây.)


Lưu ý rằng chúng ta có thể ẩn từng yếu tố trong ba yếu tố này một cách độc lập với nhau:

  • Để ẩn đường viền (còn gọi là "cột sống"): ax.set_frame_on(False)hoặcax.spines['top'].set_visible(False)

  • Để ẩn dấu tick: ax.tick_params(top=False)

  • Để ẩn nhãn: ax.tick_params(labeltop=False)


tóm tắt tốt đẹp của khả năng. +1
love.by.Jesus

9

Nếu bạn không cần đánh dấu và như vậy (ví dụ để vẽ sơ đồ minh họa định tính), bạn cũng có thể sử dụng cách giải quyết nhanh này:

Làm cho trục vô hình (ví dụ với plt.gca().axison = False) và sau đó vẽ chúng bằng tay plt.arrow.


1
điều này dường như để loại bỏ các gai nhưng để lại dấu tích tại chỗ. Bất kỳ ý tưởng làm thế nào để loại bỏ bọ ve là tốt?
Rob Young

2
@Rob: Bạn nói đúng, tôi thực sự đã sử dụng một giải pháp khác trong kịch bản mà tôi đã nghĩ đến. Tôi đã thay đổi câu trả lời của mình, điều này bây giờ sẽ hoạt động, nhưng nói chung giải pháp được chấp nhận ở trên là tốt hơn.
giờ 44 phút

9

Thư viện Seaborn được tích hợp sẵn chức năng despine ().

Chỉ cần thêm:

import seaborn as sns

Bây giờ tạo biểu đồ của bạn. Và thêm vào cuối:

sns.despine()

Nếu bạn nhìn vào một số giá trị tham số mặc định của hàm, nó sẽ loại bỏ cột sống trên cùng và bên phải và giữ cho cột sống bên dưới và bên trái:

sns.despine(top=True, right=True, left=False, bottom=False)

Xem thêm tài liệu tại đây: https://seaborn.pydata.org/generated/seaborn.despine.html


7

Nếu bạn cần xóa nó khỏi tất cả các lô của mình, bạn có thể xóa các gai trong cài đặt kiểu (biểu định kiểu hoặc RCParams). Ví dụ:

import matplotlib as mpl

mpl.rcParams['axes.spines.right'] = False
mpl.rcParams['axes.spines.top'] = False

Nếu bạn muốn loại bỏ tất cả các gai:

mpl.rcParams['axes.spines.left'] = False
mpl.rcParams['axes.spines.right'] = False
mpl.rcParams['axes.spines.top'] = False
mpl.rcParams['axes.spines.bottom'] = False
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.