giảm số lượng tích tắc


160

Tôi có quá nhiều đánh dấu trên biểu đồ của mình và chúng đang chạy vào nhau.

Làm thế nào tôi có thể giảm số lượng bọ ve?

Ví dụ: tôi có dấu tick:

1E-6, 1E-5, 1E-4, ... 1E6, 1E7

Và tôi chỉ muốn:

1E-5, 1E-3, ... 1E5, 1E7

Tôi đã thử chơi với LogLocator, nhưng tôi không thể hiểu điều này.

Câu trả lời:


266

Ngoài ra, nếu bạn chỉ muốn đặt số lượng bọ trong khi cho phép matplotlib định vị chúng (hiện chỉ với MaxNLocator), có pyplot.locator_params,

pyplot.locator_params(nbins=4)

Bạn có thể chỉ định trục cụ thể trong phương pháp này như được đề cập dưới đây, mặc định là cả hai:

# To specify the number of ticks on both or any single axes
pyplot.locator_params(axis='y', nbins=6)
pyplot.locator_params(axis='x', nbins=10)

27
Đây là một gợi ý tuyệt vời, cũng có thể chỉ định pyplot.locator_params(axis = 'x', nbins = 4)(hoặc axis = 'y') làm cho quá trình thực sự đơn giản. Cảm ơn @bgamari!
benjaminmg trong

8
Với quy mô nhật ký, điều này hoạt động với numticksthay vìnbins
meduz

1
@bgamari, bạn có thể vui lòng thêm numticksgiải pháp cho các lô lôgarit như được chỉ ra bởi @meduz không?
Løiten

7
Điều này dường như không đặt nhãn nơi mà họ nên được. Ví dụ: nếu các nhãn đánh dấu ban đầu là [0, 1, ..., 99]và bây giờ là một bộ nticks=10, thì các nhãn thưa mới sẽ được đặt cách nhau mười lần dọc theo trục, tức là bây giờ 1sẽ ngồi ở đâu 9, 2ở đâu 19... và 9ở đâu 99.
Vim

2
Kiểm tra kết quả của bạn trước khi tin tưởng phương pháp này. @Vim đúng. Các giá trị đánh dấu sẽ được đặt không chính xác.
David J.

53

Nếu ai đó vẫn nhận được trang này trong kết quả tìm kiếm:

fig, ax = plt.subplots()

plt.plot(...)

every_nth = 4
for n, label in enumerate(ax.xaxis.get_ticklabels()):
    if n % every_nth != 0:
        label.set_visible(False)

7
Điều này thực sự làm việc so với tất cả các câu trả lời khác mà không làm gì. cảm ơn :)
faizan

Làm tốt. Phải mất một thời gian để tìm thấy nó nhưng nó đã làm những gì tôi muốn.
Giăng

Cảm ơn bạn, điều này đảm bảo rằng những gì nhãn còn lại ở đúng vị trí. Một bước bổ sung sẽ cải thiện câu trả lời này là cũng xóa dấu tích.
David J.

Câu trả lời đơn giản tuyệt vời - ngạc nhiên không có phương pháp tùy chỉnh nào được cộng đồng SO biết đến. Đây sẽ là một bổ sung có giá trị cho lib?
jabberwocky

31

Để giải quyết vấn đề tùy chỉnh và sự xuất hiện của bọ ve, hãy xem hướng dẫn Đánh dấu định vị trên trang web matplotlib

ax.xaxis.set_major_locator(plt.MaxNLocator(3))

Sẽ đặt tổng số đánh dấu trong trục x thành 3 và phân bổ đều trên trục.

Ngoài ra còn có một hướng dẫn tốt đẹp về điều này


Chỉ chọn 3 chỉ số datetime đầu tiên. khi lấy rìu từ pandas.DataFrame.plot ax = df.plot()
Mithril

@Mithril xin lỗi tôi không hiểu bình luận của bạn. Bạn có thể vui lòng giải thích?
Ca ngợi Jayathissa

Nếu tôi có một df ( pandas.DataFrame) với chỉ số datetime [2019-01-01, ... 2019-11-01], hãy gọi ax = df.plot(), trả về một đối tượng hình. cuộc gọi ax.xaxis.set_major_locator(plt.MaxNLocator(3)) chỉ hiển thị 3 chỉ mục đầu tiên [2019-01-01, 2019-01 / 02, 2019-01-03].
Mithril

1
@Mithril, df.plot()thường hiển thị minor_locator, vì vậy bạn có thể muốn thử ax1.xaxis.set_minor_locator(plt.MaxNLocator(3)). Cũng nhớ thay thế 3số lượng bọ mà bạn muốn hiển thị. Đối với thời gian của gấu trúc, tôi giới thiệu import matplotlib.dates as mdatesvà chạy ax.xaxis.set_minor_locator(mdates.MonthLocator(interval = 1))vớiax.xaxis.set_minor_formatter(mdates.DateFormatter('%m-%Y'))
Prageeth Jayathissa

20

Có một set_ticks()chức năng cho các đối tượng trục.


4
Điều này sẽ hoạt động nếu tôi biết trước những gì tôi muốn. Ví dụ tôi đưa ra ở trên chỉ là một ví dụ. Tôi không biết bọ ve là gì, tôi chỉ biết tôi muốn ít hơn chúng, tức là mỗi con khác.
jlconlin

10
Bạn có thể gọi get_xticks()hoặc get_yticks()đầu tiên cho đối tượng trục, chỉnh sửa khi cần và sau đó chuyển danh sách trở lại set_ticks().
dùng812786

4
Tôi không có set_ticks(), nhưng tôi có set_xticks()set_yticks(). Đây là các thuộc tính của các đối tượng trục, không phải trục. Có lẽ điều này đã thay đổi trong vài năm qua.
Gauthier

2
Tôi không chắc là tôi có nên không, một số người đã thấy câu trả lời của bạn hữu ích và chỉ vì nó khác với tôi không có nghĩa là nó dành cho tất cả mọi người.
Gauthier

1
Một ví dụ sẽ đi một chặng đường dài để làm cho câu trả lời này hữu ích.
Richard

10

trong trường hợp ai đó vẫn cần nó, và vì không có gì ở đây thực sự hiệu quả với tôi, tôi đã nghĩ ra một cách rất đơn giản để giữ sự xuất hiện của cốt truyện được tạo ra "như hiện tại" trong khi sửa số lượng tick thành chính xác N:

import numpy as np
import matplotlib.pyplot as plt

f, ax = plt.subplots()
ax.plot(range(100))

ymin, ymax = ax.get_ylim()
ax.set_yticks(np.round(np.linspace(ymin, ymax, N), 2))

2
Tôi đã phải sửa đổi dòng cuối cùng một chút để có được nó trả về các giá trị như int thay vì float:ax.set_yticks(np.linspace(int(ymin), int(ymax), N), 2)
Nick Settje

@NickSettje vẫn nổi với tôi!
Mohd

4

Giải pháp @raphael đưa ra rất đơn giản và khá hữu ích.

Tuy nhiên, các nhãn đánh dấu được hiển thị sẽ không được lấy mẫu từ các phân phối ban đầu mà từ các chỉ mục của mảng được trả về np.linspace(ymin, ymax, N).

Để hiển thị N giá trị cách đều nhau từ nhãn đánh dấu ban đầu của bạn, hãy sử dụng set_yticklabels()phương pháp. Đây là đoạn mã cho trục y, với các nhãn số nguyên:

import numpy as np
import matplotlib.pyplot as plt

ax = plt.gca()

ymin, ymax = ax.get_ylim()
custom_ticks = np.linspace(ymin, ymax, N, dtype=int)
ax.set_yticks(custom_ticks)
ax.set_yticklabels(custom_ticks)

Kudos cho điều chỉnh tốt đẹp này!
Mohd

2

Khi sử dụng thang đo log, số lượng tick chính có thể được sửa bằng lệnh sau

import matplotlib.pyplot as plt

....

plt.locator_params(numticks=12)
plt.show()

Giá trị được đặt để numticksxác định số lượng dấu tick trục sẽ được hiển thị.

Tín dụng cho bài đăng của @ bgamari để giới thiệu locator_params()chức năng, nhưng ntickstham số sẽ đưa ra lỗi khi sử dụng thang đo nhật ký.


Câu hỏi và câu trả lời dành cho matplotlib trước đó, tức là 1, và bạn đang đề cập đến 2.
Dawid Laszuk 17/12/17
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.