줄거리 틱 수 감소


160

그래프에 틱이 너무 많아 서로 닿아 있습니다.

진드기 수를 어떻게 줄일 수 있습니까?

예를 들어 진드기가 있습니다.

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

그리고 나는 단지 원한다.

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

나는을 가지고 놀았 LogLocator지만 이것을 알아낼 수 없었습니다.

답변:


266

또는 matplotlib이 틱을 배치하는 동안 틱 수를 간단히 설정하려면 (현재는으로 만 MaxNLocator) pyplot.locator_params,

pyplot.locator_params(nbins=4)

아래에서 언급 한 것처럼이 방법에서 특정 축을 지정할 수 있습니다. 기본값은 둘 다입니다.

# 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
이것은 훌륭한 제안이었으며 프로세스 를 구체적으로 지정 pyplot.locator_params(axis = 'x', nbins = 4)(또는 axis = 'y') 할 수있게함으로써 매우 간단했습니다. 감사합니다 @bgamari!
benjaminmgross 2014

8
로그 스케일로,이와 함께 일 numticks대신nbins
meduz

1
@ bgamari, @meduz numticks가 지적한대로 대수 플롯에 대한 솔루션을 추가 할 수 있습니까?
Løiten

7
이것은 레이블을 원래 위치에 배치하지 않는 것 같습니다. 예를 들어, 원래 틱 레이블 인 경우 [0, 1, ..., 99]한 세트는 지금 nticks=10, 새로운 스파 스 라벨은 오랫동안 떨어져 축을 따라, 즉 지금과 같이 열 번 배치됩니다 1어디에 앉을 9이었다 219이었다 ... 그리고 999이었다.
Vim

2
이 방법을 신뢰하기 전에 결과를 확인하십시오. @Vim이 맞습니다. 눈금 값이 잘못 배치됩니다.
David J.

53

누군가 여전히 검색 결과에서이 페이지를 얻는 경우 :

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
이것은 실제로 아무것도하지 않은 다른 모든 답변에 비해 효과적이었습니다. thanks :)
faizan

잘 했어. 이것을 찾는 데 시간이 걸렸지 만 내가 원하는 것을했습니다.
John

감사합니다. 이렇게하면 남아있는 레이블이 올바른 위치에있게됩니다. 이 답변을 개선하는 추가 단계는 눈금을 제거하는 것입니다.
David J.

대단한 대답-SO 커뮤니티에 알려진 사용자 정의 방법이 없었습니다. 이것은 lib에 귀중한 추가 물입니까?
jabberwocky

32

진드기의 사용자 정의 및 모양 문제를 해결하려면 matplotlib 웹 사이트 의 Tick ​​Locators 가이드를 참조하십시오.

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

x 축의 틱 수를 3으로 설정하고 축에 균등하게 분배합니다.

이것에 대한 좋은 튜토리얼 도 있습니다


처음 3 개의 날짜 / 시간 인덱스 만 선택하십시오. pandas.DataFrame.plot에서 도끼를 얻을 때 ax = df.plot()
Mithril

@Mithril 죄송합니다 귀하의 의견을 이해하지 못합니다. 좀 더 자세히 설명해 주시겠습니까?
Prageeth Jayathissa

pandas.DataFrame날짜 시간 인덱스가 [2019-01-01, ... 2019-11-01] 인 df ( ) 가 있으면을 호출 ax = df.plot()하고 그림 객체를 반환하십시오. call ax.xaxis.set_major_locator(plt.MaxNLocator(3)) 은 처음 3 개의 인덱스 만 표시합니다 [2019-01-01, 2019-01-02, 2019-01-03].
Mithril

1
@Mithril은 df.plot()종종을 표시 minor_locator하므로 시도해 볼 수 있습니다 ax1.xaxis.set_minor_locator(plt.MaxNLocator(3)). 또한 3표시하려는 진드기 수 를 대신 사용하십시오 . 팬더 import matplotlib.dates as mdatesax.xaxis.set_minor_locator(mdates.MonthLocator(interval = 1))ax.xaxis.set_minor_formatter(mdates.DateFormatter('%m-%Y'))
시계 시리즈의 경우

20

set_ticks()축 객체에 대한 기능이 있습니다.


4
내가 원하는 진드기를 미리 알고 있다면 이것은 효과가 있습니다. 위에서 제시 한 예는 단지 예일뿐입니다. 나는 진드기가 무엇인지 모른다. 나는 단지 그 진드기가 더 적은 것을 원한다는 것을 안다.
jlconlin

10
axes 객체를 호출 get_xticks()하거나 get_yticks()먼저 필요에 따라 편집 한 다음 목록을 다시 전달할 수 set_ticks()있습니다.
user812786

4
나는 없습니다 만 set_ticks(), set_xticks()그리고 set_yticks()있습니다. 이것들은 축이 아닌 좌표축 객체의 속성입니다. 아마도 이것은 지난 몇 년 동안 바뀌었을 것입니다.
Gauthier

2
내가해야할지 잘 모르겠지만, 어떤 사람들은 귀하의 답변이있는 그대로 유용하다고 생각했습니다. 그것이 저와 다르다고해서 모든 사람에게 해당되는 것은 아닙니다.
Gauthier

1
이 답변을 유용하게 만드는 한 가지 예가 있습니다.
Richard

10

누군가가 여전히 그것을 필요로하고 여기에 실제로 아무것도 효과가 없었기 때문에 생성 된 줄거리의 모양을 "있는 그대로"유지하면서 틱 수를 정확히 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
float 대신 int로 값을 반환하기 위해 마지막 줄을 약간 수정해야했습니다.ax.set_yticks(np.linspace(int(ymin), int(ymax), N), 2)
Nick Settje

@NickSettje는 여전히 나와 함께 떠 있습니다!
Mohd

4

@raphael이 준 솔루션은 간단하고 매우 유용합니다.

여전히 표시된 눈금 레이블은 원래 분포에서 샘플링 된 값이 아니라에서 반환 한 배열 의 인덱스 에서 샘플링 된 값 np.linspace(ymin, ymax, N)입니다.

원래 눈금 레이블과 간격을두고 N 값을 표시하려면이 set_yticklabels()방법을 사용하십시오 . 다음은 정수 레이블이있는 y 축 스 니펫입니다.

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)

이 멋진 조정에 대한 명성!
Mohd

2

로그 스케일을 사용하는 경우 다음 명령으로 주요 틱 수를 수정할 수 있습니다

import matplotlib.pyplot as plt

....

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

numticks표시 할 축 눈금 수 를 결정하도록 설정된 값입니다 .

locator_params()함수 소개에 대해서는 @bgamari의 게시물에 기록 하지만 nticks로그 스케일을 사용 하면 매개 변수에서 오류가 발생합니다.


질문과 대답은 즉, 이전하기 matplotlib 1이고, 당신은 2를 참조하고
DAWID Laszuk
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.