Ẩn văn bản trục trong các ô matplotlib


370

Tôi đang cố gắng vẽ một hình không có dấu hoặc số trên một trong hai trục (Tôi sử dụng các trục theo nghĩa truyền thống, không phải là danh pháp matplotlib!). Một vấn đề tôi gặp phải là nơi matplotlib điều chỉnh các ticklabels x (y) bằng cách trừ đi một giá trị N, sau đó thêm N vào cuối trục.

Điều này có thể mơ hồ, nhưng ví dụ đơn giản sau đây nêu bật vấn đề, với '6.18' là giá trị vi phạm của N:

import matplotlib.pyplot as plt
import random
prefix = 6.18

rx = [prefix+(0.001*random.random()) for i in arange(100)]
ry = [prefix+(0.001*random.random()) for i in arange(100)]
plt.plot(rx,ry,'ko')

frame1 = plt.gca()
for xlabel_i in frame1.axes.get_xticklabels():
    xlabel_i.set_visible(False)
    xlabel_i.set_fontsize(0.0)
for xlabel_i in frame1.axes.get_yticklabels():
    xlabel_i.set_fontsize(0.0)
    xlabel_i.set_visible(False)
for tick in frame1.axes.get_xticklines():
    tick.set_visible(False)
for tick in frame1.axes.get_yticklines():
    tick.set_visible(False)

plt.show()

Ba điều tôi muốn biết là:

  1. Làm thế nào để tắt hành vi này ở nơi đầu tiên (mặc dù trong hầu hết các trường hợp nó rất hữu ích, không phải lúc nào cũng vậy!) Tôi đã xem qua matplotlib.axis.XAxisvà không thể tìm thấy bất cứ điều gì phù hợp

  2. Làm thế nào tôi có thể làm cho N biến mất (tức là X.set_visible(False))

  3. Có cách nào tốt hơn để làm những điều trên không? Cốt truyện cuối cùng của tôi sẽ là các ô con 4 x 4 trong một hình, nếu điều đó có liên quan.


Tôi có một chút nghi ngờ nếu bất kỳ câu trả lời nào ở đây thực sự trả lời câu hỏi. Đối với tôi có vẻ như câu hỏi hỏi làm thế nào để thoát khỏi sự bù đắp . Tuy nhiên, tất cả các câu trả lời cho thấy nhiều cách khác nhau để loại bỏ tất cả các ticklabels. Nếu câu hỏi đã bị mê hoặc bởi các câu trả lời, có lẽ người ta nên chỉnh sửa câu hỏi để hỏi xem câu trả lời cung cấp giải pháp cho cái gì?
ImportanceOfByingErnest

Câu trả lời:


471

Thay vì ẩn từng phần tử, bạn có thể ẩn toàn bộ trục:

frame1.axes.get_xaxis().set_visible(False)
frame1.axes.get_yaxis().set_visible(False)

Hoặc, bạn có thể đặt các đánh dấu vào một danh sách trống:

frame1.axes.get_xaxis().set_ticks([])
frame1.axes.get_yaxis().set_ticks([])

Trong tùy chọn thứ hai này, bạn vẫn có thể sử dụng plt.xlabel()plt.ylabel()thêm nhãn vào các trục.


2
Hey Ofri - thật tuyệt, cảm ơn, nhưng bây giờ (chỉ là khó xử) chuyện gì xảy ra nếu tôi muốn thêm một xlabel ()? Khác với việc tự đặt một widget văn bản.
Dave

5
Làm thế nào bạn có thể mở rộng ví dụ này thành 3d? ax = plt.gca (chiếu = '3d'), ax.axes.get_zaxis (). set_visible (Sai) cho'Axes3DSubplot' object has no attribute 'get_zaxis'
user989762

13
Câu trả lời này không cho phép các đường lưới hiển thị. Câu trả lời của @saullo castro mặc dù ...
evan54

Vấn đề là khi x_axis được đặt ở chế độ ẩn, mạng lưới hiển thị :( Chỉnh sửa: Chỉ cần xem câu trả lời của @Saullo Castro đã khắc phục sự cố.
Shailen

1
@ user989762 Trong trường hợp của bạn, phương pháp này sẽ không hoạt động, thậm chí không get_xaxis().set_visible(False). Tôi nghĩ matplotlib trong trường hợp này khởi tạo một số tham số như thể cốt truyện là 2D. ax.set_zticks([])sẽ làm những gì bạn muốn
kon psych

222

Nếu bạn muốn ẩn chỉ văn bản trục giữ các đường lưới:

frame1 = plt.gca()
frame1.axes.xaxis.set_ticklabels([])
frame1.axes.yaxis.set_ticklabels([])

Làm set_visible(False)hoặc set_ticks([])cũng sẽ ẩn các đường lưới.


4
việc này sẽ xóa nhãn cho tất cả các ô con có chung trục đó: /
endolith

136

Nếu bạn giống như tôi và không phải lúc nào cũng lấy được các trục ax, khi vẽ đồ thị, thì một giải pháp đơn giản sẽ là làm

plt.xticks([])
plt.yticks([])

56

Một phần của một chủ đề cũ nhưng, đây dường như là một phương pháp nhanh hơn bằng cách sử dụng phiên bản mới nhất của matplotlib:

đặt bộ định dạng chính cho trục x

ax.xaxis.set_major_formatter(plt.NullFormatter())

1
Điều gì nếu bạn chỉ muốn làm điều đó cho một đánh dấu duy nhất?
tommy.carstensen 14/2/2015

5
Có, điều này hữu ích khi chỉ ẩn nhãn, vì .set_xticks ([]) cũng tự xóa dấu tích.
zbyszek

49

Tôi thực sự không thể hiển thị hình ảnh mà không có viền hoặc dữ liệu trục dựa trên bất kỳ đoạn mã nào ở đây (ngay cả hình ảnh được chấp nhận tại câu trả lời). Sau khi đào qua một số tài liệu API, tôi đã tìm đến mã này để hiển thị hình ảnh của mình

plt.axis('off')
plt.tick_params(axis='both', left='off', top='off', right='off', bottom='off', labelleft='off', labeltop='off', labelright='off', labelbottom='off')
plt.savefig('foo.png', dpi=100, bbox_inches='tight', pad_inches=0.0)

Tôi đã sử dụng tick_paramscuộc gọi để cơ bản tắt bất kỳ thông tin bổ sung nào có thể được hiển thị và tôi có một biểu đồ hoàn hảo trong tệp đầu ra của mình.


1
Khi các trục được chia sẻ, các giải pháp dựa trên set_ticklabels lan truyền trên các trục được chia sẻ. Chỉ có giải pháp này dựa trên tick_params mới hoạt động tốt với tôi.
Christian O'Reilly

39

Tôi đã mã hóa màu này để giảm bớt quá trình.

import matplotlib.pyplot as plt
fig = plt.figure()
ax = fig.add_subplot(111)

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

Bạn có thể có toàn quyền kiểm soát hình bằng các lệnh này, để hoàn thành câu trả lời Tôi cũng thêm quyền kiểm soát các spline:

ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False)

# X AXIS -BORDER
ax.spines['bottom'].set_visible(False)
# BLUE
ax.set_xticklabels([])
# RED
ax.set_xticks([])
# RED AND BLUE TOGETHER
ax.axes.get_xaxis().set_visible(False)

# Y AXIS -BORDER
ax.spines['left'].set_visible(False)
# YELLOW
ax.set_yticklabels([])
# GREEN
ax.set_yticks([])
# YELLOW AND GREEN TOGHETHER
ax.axes.get_yaxis().set_visible(False)

ax.set_xticklabels([])ax.set_xticks([])không làm việc cho tôi, nhưng ax.axes.get_xaxis().set_visible(False)đã làm.
Homero Esmeraldo

2
đây phải là câu trả lời được chấp nhận
Jason S

6

Khi sử dụng API hướng đối tượng, Axesđối tượng có hai phương thức hữu ích để xóa văn bản trục set_xticklabels()set_xticks().

Giả sử bạn tạo một cốt truyện bằng cách sử dụng

fig, ax = plt.subplots(1)
ax.plot(x, y)

Nếu bạn chỉ muốn xóa nhãn tick, bạn có thể sử dụng

ax.set_xticklabels([])

hoặc để loại bỏ hoàn toàn bọ ve, bạn có thể sử dụng

ax.set_xticks([])

Các phương pháp này rất hữu ích để chỉ định chính xác nơi bạn muốn đánh dấu và cách bạn muốn chúng được dán nhãn. Vượt qua một danh sách trống dẫn đến không có dấu tích, hoặc không có nhãn, tương ứng.


2

Một mẹo nhỏ có thể là đặt màu của nhãn tick là màu trắng để ẩn nó!

plt.xticks(color='w')
plt.yticks(color='w')
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.