[python] matplotlib에서 x 또는 y 축의 “틱 주파수”를 변경 하시겠습니까?

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

말하다

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

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

그런 다음 할 것입니다 :

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

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



답변

다음과 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()


답변

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

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()


답변

나는이 솔루션을 좋아한다 ( 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()자동 한계 결정을 허용하며 나중에 쉽게 읽을 수 있습니다.


답변

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

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


답변

이것은 약간 해킹이지만, 내가 찾은 예제를 이해하는 것이 가장 깨끗하고 쉽습니다. 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)


답변

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

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 기능을 다시 실행하십시오.


답변

우아한 솔루션을 개발했습니다. 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()