matplotlib에서 x 또는 y 축의 "틱 주파수"를 변경 하시겠습니까?


477

파이썬이 데이터를 플롯하는 방법을 수정하려고합니다.

말하다

x = [0,5,9,10,15]

y = [0,1,2,3,4]

그런 다음 할 것입니다 :

matplotlib.pyplot.plot(x,y)
matplotlib.pyplot.show()

x 축의 눈금은 5 간격으로 표시됩니다. 1 간격을 표시하는 방법이 있습니까?


6
여기서 진드기가 적절한 단어이지만 진드기를 단계 크기로 변경하면이 질문에 더 많은 초보자를 안내 할 것입니다.
Sibbs Gambling

9
밀접하게 관련된 질문 : stackoverflow.com/questions/6682784/… 그리고 훌륭한 해결책 :pyplot.locator_params(nbins=4)
Dr. Jan-Philip Gehrcke

nbins는 불행히도 matplotlib2.x에서 더 이상 사용되지 않는 것 같습니다
jeremy_rutman 8:08의

답변:


583

다음과 plt.xticks같이 표시를 할 위치를 명시 적으로 설정할 수 있습니다 .

plt.xticks(np.arange(min(x), max(x)+1, 1.0))

예를 들어

import numpy as np
import matplotlib.pyplot as plt

x = [0,5,9,10,15]
y = [0,1,2,3,4]
plt.plot(x,y)
plt.xticks(np.arange(min(x), max(x)+1, 1.0))
plt.show()

( np.arange파이썬보다는 사용 된 range경우를 대비 기능을 min(x)하고 max(x)있다은의 int 대신 수레.)


plt.plot(또는 ax.plot) 기능이 자동으로 기본 설정됩니다 xy제한. 이러한 제한을 유지하고 눈금 표시의 단계를 변경하려면 ax.get_xlim()Matplotlib이 이미 설정 한 제한을 찾는 데 사용할 수 있습니다 .

start, end = ax.get_xlim()
ax.xaxis.set_ticks(np.arange(start, end, stepsize))

기본 틱 포맷터는 틱 값을 상당한 수의 유효 자릿수로 반올림하는 적절한 작업을 수행해야합니다. 그러나 형식을보다 세밀하게 제어하려면 고유 한 형식기를 정의 할 수 있습니다. 예를 들어

ax.xaxis.set_major_formatter(ticker.FormatStrFormatter('%0.1f'))

실행 가능한 예제는 다음과 같습니다.

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.ticker as ticker

x = [0,5,9,10,15]
y = [0,1,2,3,4]
fig, ax = plt.subplots()
ax.plot(x,y)
start, end = ax.get_xlim()
ax.xaxis.set_ticks(np.arange(start, end, 0.712123))
ax.xaxis.set_major_formatter(ticker.FormatStrFormatter('%0.1f'))
plt.show()

72
여전히 자신의 한계를 결정할 수있는 방법이 없지만 단계 크기를 변경합니까? 분이 3523.232512와 같은 경우이 방법은 그리 좋지 않습니다!
코 로네

3
@Corone, 당신이 요청한지 오래되었지만, 자동 범위 결정을 사용하면서 단계 크기를 쉽게 제어 할 수있는 아래 답변을 게시했습니다.
jthomas

3
마지막 틱 마크를 표시 하려면 +1in plt.xticks(np.arange(min(x), max(x)+1, 1.0))이 필요합니다.
Alex Willison

1
예, np.arange(start, stop)의 값 생성 반 개방 구간 [start, stop)을 포함 start하지만, 제외를 stop. 그래서 나는 max(x)+1그것이 max(x)포함 되도록 보장했습니다 .
unutbu

4
datetime에 해당하는 것이 plt.xticks(np.arange(min(dates), max(dates)+0.1,0.1)있습니까? 그것은 올해의 음모를
꾸미는

207

다른 방법은 축 로케이터를 설정하는 것입니다.

import matplotlib.ticker as plticker

loc = plticker.MultipleLocator(base=1.0) # this locator puts ticks at regular intervals
ax.xaxis.set_major_locator(loc)

필요에 따라 여러 유형의 로케이터가 있습니다.

전체 예는 다음과 같습니다.

import matplotlib.pyplot as plt
import matplotlib.ticker as plticker

x = [0,5,9,10,15]
y = [0,1,2,3,4]
fig, ax = plt.subplots()
ax.plot(x,y)
loc = plticker.MultipleLocator(base=1.0) # this locator puts ticks at regular intervals
ax.xaxis.set_major_locator(loc)
plt.show()

7
예상대로 작동하지 않습니다. 특히 날짜를 사용할 때는 적절한 날짜를 사용하지 않습니다.
Chris Fonnesbeck

35
날짜를 사용할 때는 matplotlib.dates 모듈의 메소드를 사용해야합니다. 예를 들어matplotlib.dates.AutoDateLocator()
robochat

3
날짜와 함께 예상대로 작동했습니다. 이 솔루션은 허용되는 솔루션보다 훨씬 쉽습니다.
Pablo Suau

base=1.0실제로 무엇을 의미합니까?
javadba

base = 1.0은 모든 정수에 대해 로케이터가 있음을 의미합니다. 이 문서는 MultipleLocator가 "뷰 간격 내에서베이스의 각 정수 배수에 눈금을 설정합니다"라고 말합니다. 따라서 base = 2이면 짝수에 대한 틱이 있고 base = 2.5를 넣을 수 있다고 생각합니다.
robochat

124

나는이 솔루션을 좋아한다 ( Matplotlib Plotting Cookbook에서 ) :

import matplotlib.pyplot as plt
import matplotlib.ticker as ticker

x = [0,5,9,10,15]
y = [0,1,2,3,4]

tick_spacing = 1

fig, ax = plt.subplots(1,1)
ax.plot(x,y)
ax.xaxis.set_major_locator(ticker.MultipleLocator(tick_spacing))
plt.show()

이 솔루션은에 주어진 숫자를 통해 틱 간격을 명시 적으로 제어하고 ticker.MultipleLocater()자동 한계 결정을 허용하며 나중에 쉽게 읽을 수 있습니다.


3
틱을 명시 적으로 계산하지 않고 이것을 수행하는 방법!
Zelphir Kaltstahl

4
이 같은 대답 이 하나 . 2 년 후 동일한 답변을 추가하는 것은 의미가 없습니다.
ImportanceOfBeingErnest

6
잘 잡았습니다. 나는 대답을 게시 할 때 그것들을 동일하게 인식하지 못했습니다. 아직도, 나는이 프리젠 테이션이 이해하기 조금 더 쉽다고 생각합니다.
jthomas

이 답변의 책 참조는 자세한 정보를 얻을 수있는 유용한 정보를 제공합니다.
Steven C. Howell

1
이것은 3 년 전에 온 robochat과 같은 대답입니다.
MERose

90

일반 원 라이너에 관심이있는 사람은 현재 틱을 가져 와서 다른 모든 틱을 샘플링하여 새 틱을 설정하는 데 사용하십시오.

ax.set_xticks(ax.get_xticks()[::2])

3
이것은 다른 틱 유형 (STR, 부동 소수점, 날짜)에 대한 유일한 일반화 답변입니다
RYSZARD Cetnarski

2
정수가 아닌 틱 제거 : ax.set_xticks([tick for tick in ax.get_xticks() if tick % 1 == 0])
user2839288

위의 자세한 솔루션이 많이 있지만 이것이 가장 간결하다는 데 동의합니다. ax.get_xticks ()의 길이를 추출하고이 길이로 슬라이싱 빈도를 필요한 틱 수로 나눈 값을 설정할 수도 있습니다.
Iain D

이것이 가장 좋은 대답이라고 생각합니다. 대부분의 다른 답변은 너무 복잡하여 적용 / 일반화하기가 어렵습니다. 감사합니다!
Seankala

2
그것은 막대기의 수를 줄일 수 있지만, 질문에서 (그리고 그것을 찾은 방법은) 막대기를 늘리는 것이 었습니다.
Alexei Martianov

36

이것은 약간 해킹이지만, 내가 찾은 예제를 이해하는 것이 가장 깨끗하고 쉽습니다. SO에 대한 답변에서 온 것입니다.

matplotlib colorbar에서 모든 n 번째 눈금 레이블을 숨기는 가장 깨끗한 방법은 무엇입니까?

for label in ax.get_xticklabels()[::2]:
    label.set_visible(False)

그런 다음 원하는 밀도에 따라 레이블을 보이게 설정하거나 표시하지 않도록 설정할 수 있습니다.

편집 : 때로는 matplotlib가 labels ==을 설정 ''하므로 레이블이 없거나 실제로 표시되지 않을 때 레이블이없는 것처럼 보일 수 있습니다. 실제 보이는 레이블을 반복하려면 다음을 시도하십시오.

visible_labels = [lab for lab in ax.get_xticklabels() if lab.get_visible() is True and lab.get_text() != '']
plt.setp(visible_labels[::2], visible=False)

3
가장 단순하고 일반적인 솔루션입니다. 미세 조정 : 일반적으로 ax.get_xticklabels()[1::2]레이블을 숨 깁니다.
jolvi

이 matplotlib.finance.candlestick2 작동하지 않습니다
BCR

@BCR 그것은 xticklabels 중 일부가 막 설정되어 ''있기 때문에 그것들을 반복 할 때 보이지 않는 비어있는 xticklabels를 만들고 있습니다 (시각화에는 영향을 미치지 않지만 당신이 당기지 않을 수도 있음을 의미 할 수 있습니다) 올바른 라벨). 당신은 시도 할 수 있습니다 : vis_labels = [label for label in ax.get_xticklabels() if label.get_visible() is True]; plt.setp(vis_labels[::2], visible==False)
choldgraf

15

이것은 오래된 주제이지만, 나는 이것을 때때로 우연히 발견 하고이 기능을 만들었습니다. 매우 편리합니다 :

import matplotlib.pyplot as pp
import numpy as np

def resadjust(ax, xres=None, yres=None):
    """
    Send in an axis and I fix the resolution as desired.
    """

    if xres:
        start, stop = ax.get_xlim()
        ticks = np.arange(start, stop + xres, xres)
        ax.set_xticks(ticks)
    if yres:
        start, stop = ax.get_ylim()
        ticks = np.arange(start, stop + yres, yres)
        ax.set_yticks(ticks)

이와 같이 진드기를 제어하는 ​​한 가지주의 사항은 추가 된 라인 이후에 더 이상 최대 스케일의 대화식 자동 업데이트를 즐기지 않는다는 것입니다. 그런 다음

gca().set_ylim(top=new_top) # for example

resadjust 기능을 다시 실행하십시오.


11

우아한 솔루션을 개발했습니다. X 축과 X의 각 점에 대한 레이블 목록이 있다고 가정하십시오.

예:
import matplotlib.pyplot as plt

x = [0,1,2,3,4,5]
y = [10,20,15,18,7,19]
xlabels = ['jan','feb','mar','apr','may','jun']
'feb'와 'jun'에 대해서만 진드기 레이블을 표시한다고 가정 해 봅시다.
xlabelsnew = []
for i in xlabels:
    if i not in ['feb','jun']:
        i = ' '
        xlabelsnew.append(i)
    else:
        xlabelsnew.append(i)
좋습니다. 이제 가짜 레이블 목록이 있습니다. 먼저 원본 버전을 플로팅했습니다.
plt.plot(x,y)
plt.xticks(range(0,len(x)),xlabels,rotation=45)
plt.show()
이제 수정 된 버전입니다.
plt.plot(x,y)
plt.xticks(range(0,len(x)),xlabelsnew,rotation=45)
plt.show()

6

최소 상용구를 사용하여 간단한 하나의 라이너 간격을 설정하려면 다음을 수행하십시오.

plt.gca().xaxis.set_major_locator(plt.MultipleLocator(1))

작은 진드기에도 쉽게 작동합니다.

plt.gca().xaxis.set_minor_locator(plt.MultipleLocator(1))

한 입 가득하지만 꽤 컴팩트


2
xmarks=[i for i in range(1,length+1,1)]

plt.xticks(xmarks)

이것은 나를 위해 일했다

[1,5] (1과 5 포함) 사이에 진드기를 원하면 교체하십시오.

length = 5

1
참고로 간단히 쓸 수 xmarks = range(1, length+1, 1)있습니다. 목록 이해가 중복되는지 확인하십시오.
Neal

2

순수한 파이썬 구현

다음은 양수, 음수 또는 혼합 값으로 숫자 시리즈 (int 또는 float)를 처리하고 원하는 단계 크기를 지정할 수있는 원하는 기능의 순수한 파이썬 구현입니다.

import math

def computeTicks (x, step = 5):
    """
    Computes domain with given step encompassing series x
    @ params
    x    - Required - A list-like object of integers or floats
    step - Optional - Tick frequency
    """
    xMax, xMin = math.ceil(max(x)), math.floor(min(x))
    dMax, dMin = xMax + abs((xMax % step) - step) + (step if (xMax % step != 0) else 0), xMin - abs((xMin % step))
    return range(dMin, dMax, step)

샘플 출력

# Negative to Positive
series = [-2, 18, 24, 29, 43]
print(list(computeTicks(series)))

[-5, 0, 5, 10, 15, 20, 25, 30, 35, 40, 45]

# Negative to 0
series = [-30, -14, -10, -9, -3, 0]
print(list(computeTicks(series)))

[-30, -25, -20, -15, -10, -5, 0]

# 0 to Positive
series = [19, 23, 24, 27]
print(list(computeTicks(series)))

[15, 20, 25, 30]

# Floats
series = [1.8, 12.0, 21.2]
print(list(computeTicks(series)))

[0, 5, 10, 15, 20, 25]

# Step – 100
series = [118.3, 293.2, 768.1]
print(list(computeTicks(series, step = 100)))

[100, 200, 300, 400, 500, 600, 700, 800]

샘플 사용법

import matplotlib.pyplot as plt

x = [0,5,9,10,15]
y = [0,1,2,3,4]
plt.plot(x,y)
plt.xticks(computeTicks(x))
plt.show()

샘플 사용량 도표

x 축의 정수 값은 모두 5로 균일 한 간격을 유지하지만 y 축의 간격이 다릅니다 ( matplotlib틱이 지정되지 않았기 때문에 기본 동작).

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.