HOWTO · Matplotlib

Matplotlib에서 X 축 값 설정

이 튜토리얼은 Matplotlib에서 matplotlib.pyplot.xticks()를 사용하여 X 축 값을 설정하는 방법을 보여줍니다.

이 페이지의 내용

matplotlib.pyplot.xticks()를 사용하면 X축 눈금이 표시될 위치와, 선택적으로 각 위치에 표시할 텍스트를 지정할 수 있습니다. 눈금 위치는 가로 좌표를 나타내며, 그래프에 그려진 데이터나 축 제목을 바꾸지는 않습니다. 그래프를 읽기 쉽게 만들려면 각 레이블이 해당 위치와 데이터 포인트에 맞도록 지정하세요.

X축 눈금 위치와 레이블 설정

xticks()의 첫 번째 인수는 위치의 시퀀스입니다. 선택 사항인 두 번째 인수에는 각 위치에 표시할 레이블을 하나씩 지정합니다. 두 시퀀스의 길이와 순서를 동일하게 유지하세요. 다음 예제는 하나의 그림에서 사용자 지정 레이블, 숫자 간격, 간격이 균등한 인덱스 방식, 그리고 일부만 표시하고 회전한 범주 레이블을 보여 줍니다.

import matplotlib.pyplot as plt

x = [1, 2, 5, 9]
y = [3, 5, 4, 8]
labels = ['Jan', 'Feb', 'May', 'Sep']
categories = ['North region', 'South region', 'East region', 'West region', 'Central region']
values = [12, 9, 14, 7, 11]

fig, axes = plt.subplots(2, 2, figsize=(10, 7))

axes[0, 0].plot(x, y, marker='o')
axes[0, 0].set_title('Custom labels')
axes[0, 0].set_xlabel('Month')
axes[0, 0].set_ylabel('Value')
plt.sca(axes[0, 0])
plt.xticks(x, labels)

axes[0, 1].plot(x, y, marker='o')
axes[0, 1].set_title('Numeric spacing')
axes[0, 1].set_xlabel('X value')
axes[0, 1].set_ylabel('Value')

index_positions = list(range(len(x)))
axes[1, 0].plot(index_positions, y, marker='o')
axes[1, 0].set_title('Evenly spaced positions')
axes[1, 0].set_xlabel('Month')
axes[1, 0].set_ylabel('Value')
axes[1, 0].set_xticks(index_positions)
axes[1, 0].set_xticklabels(labels)

axes[1, 1].bar(categories, values)
axes[1, 1].set_title('Fewer, rotated category labels')
axes[1, 1].set_ylabel('Value')
axes[1, 1].set_xticks([0, 2, 4])
axes[1, 1].set_xticklabels(categories[::2])
plt.sca(axes[1, 1])
plt.xticks(rotation=35, ha='right')

fig.tight_layout()
plt.show()

왼쪽 위 그래프는 네 개의 위치를 네 개의 월 이름 레이블과 연결합니다. 변경되지 않은 예제에서 월 이름을 비롯한 그래프의 표시 레이블은 영어로 되어 있습니다. 숫자 그래프는 실제 x값을 사용하므로 2에서 5까지의 간격이 1에서 2까지의 간격보다 넓습니다. 왼쪽 아래 그래프는 대신 0부터 3까지의 위치를 사용해 각 값을 해당 월과 짝지으면서 월 사이 간격을 시각적으로 동일하게 만듭니다. 마지막 그래프는 막대 다섯 개를 표시하고 겹침을 줄이기 위해 0, 2, 4 위치에만 레이블을 붙인 다음, 레이블을 회전해 오른쪽 정렬합니다. Matplotlib이 설치된 Python 환경에서 스크립트를 실행하세요. 여기에 캡처된 출력은 포함되어 있지 않습니다.

간격이 균등하지 않은 X값 처리

숫자 축은 숫자 사이의 거리를 나타냅니다. 측정값의 x값이 1, 2, 5, 9라면 그 값을 기준으로 그렸을 때 2와 5 사이, 5와 9 사이가 더 넓게 표시됩니다. 눈금 레이블을 월 이름으로 바꿔도 좌표는 달라지지 않습니다. 거리나 경과 시간이 중요하다면 이 간격을 유지하세요.

범주를 같은 간격으로 비교하려면 range(len(x)) 같은 인덱스 위치를 기준으로 y값을 그린 다음, 범주 이름을 눈금 레이블로 사용하세요. 데이터 시퀀스와 레이블은 같은 순서를 따라야 합니다. 이렇게 하면 가로축의 기준이 숫자 간 거리에서 범주의 순서로 바뀌므로, 숫자 측정값 사이의 간격이 의미 있는 경우에는 적합하지 않습니다.

날짜를 나타내는 레이블에는 날짜 값을 x 데이터로 사용하고 필요에 따라 날짜 눈금 형식을 지정하세요. 서로 관계없는 숫자 좌표에 월 이름을 붙여도 그 좌표가 날짜가 되는 것은 아닙니다.

눈금 빈도 조절 및 레이블 가독성 개선

작은 그래프에서 일부 눈금만 표시하려면 xticks()에 위치를 직접 전달하세요. 예를 들어 plt.xticks(x[::2])는 순서가 있는 시퀀스에서 두 번째 값마다 선택합니다. 일정한 숫자 축에서는 화면 범위가 바뀔 때 적절한 간격을 선택하도록 로케이터를 사용할 수 있습니다. 예를 들어 matplotlib.ticker에서 MultipleLocator를 가져온 뒤 ax.xaxis.set_major_locator(MultipleLocator(2))를 호출하면 주요 눈금 간격을 2단위로 지정합니다. 의미 있는 범주 레이블에는 위치를 직접 지정하고, 숫자 축에는 로케이터를 선택하세요.

긴 레이블은 plt.xticks(rotation=35, ha='right')로 회전할 수 있습니다. ha는 가로 정렬을 설정합니다. 레이블을 회전해도 서로 겹친다면 그림 너비를 늘리거나 눈금 수를 줄이세요. tight_layout()은 축 주변에 공간을 마련할 수 있지만, 어떤 눈금이 적절한지는 선택하지 않습니다.

위 예제에서는 대부분의 패널에 개별 축의 set_xticks를 사용하고, 현재 축의 레이블을 사용자 지정할 때는 xticks를 사용합니다. 객체 지향 방식에서 ax.set_xticks(positions, labels)를 사용하면 작업 대상을 특정 축으로 지정할 수 있습니다. pyplot을 사용하고 그림에 여러 그래프가 있다면 먼저 대상 축을 선택하세요.

FAQ: X축 값 설정

위치와 레이블을 한 번에 설정할 수 있나요? 네. plt.xticks(positions, labels)에 두 시퀀스를 모두 전달하거나 ax.set_xticks(positions, labels)를 사용하세요. 각 레이블은 인덱스에 따라 해당 위치에 연결됩니다.

눈금을 더 적게 표시하려면 어떻게 하나요? 눈금 위치 목록을 더 짧게 지정하거나, 간격이 일정한 숫자 눈금에 로케이터를 사용하세요. 눈금 빈도는 그래프에 표시된 데이터 포인트 수와 별개입니다.

X축에 텍스트 범주를 사용할 수 있나요? 네. 막대 그래프처럼 범주 값을 직접 그리거나 숫자 인덱스 위치를 그린 다음 범주 이름을 레이블로 지정할 수 있습니다. 특정 범주 순서나 균등한 간격이 필요하면 후자를 사용하세요.

레이블이 겹치면 어떻게 해야 하나요? 레이블 수를 줄이거나, 회전하거나, 회전한 텍스트를 오른쪽 정렬하거나, 그림 너비를 늘려 보세요. 이러한 변경은 눈금 레이블에 영향을 주며 그래프에 그려진 값은 바꾸지 않습니다.