Matplotlib으로 3D 그래프를 그리다 보면 배경 판(pane)과 축선, 눈금은 모두 감추고 X, Y, Z축 레이블만 남겨야 하는 경우가 있습니다. 이 글에서는 bar3d() 메서드로 3D 막대그래프를 그린 뒤, 축 요소들을 투명하게 처리하고 눈금을 제거하여 축을 숨기는 방법을 단계별로 살펴봅니다.
구현 단계
- figure 크기를 설정하고 서브플롯 주변 및 사이 여백을 조정합니다.
- 새 figure를 생성하거나 기존 figure를 활성화합니다.
- 서브플롯 배치의 일부로 figure에 3D Axes를 추가합니다.
- numpy를 사용해 x, y, z, dx, dy, dz 데이터 포인트를 생성합니다.
- bar3d() 메서드로 3D 막대그래프를 그립니다.
- 축을 숨기기 위해 축 색상과 동일한 투명한 색상 튜플을 초기화합니다.
- x, y, z축의 평면(pane) 색상 속성을 해당 색상 튜플로 설정합니다.
- x, y, z축의 선(line) 색상 속성도 동일한 색상 튜플로 설정합니다.
- x, y, z축에 빈 눈금(ticks)을 설정합니다.
- x, y, z축 레이블을 지정합니다.
- show() 메서드로 figure를 화면에 표시합니다.
예제 코드
import numpy as np
from matplotlib import pyplot as plt
plt.rcParams["figure.figsize"] = [7.50, 3.50]
plt.rcParams["figure.autolayout"] = True
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
x = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
y = [5, 6, 7, 8, 2, 5, 6, 3, 7, 2]
z = np.zeros(10)
dx = np.ones(10)
dy = np.ones(10)
dz = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
ax.bar3d(x, y, z, dx, dy, dz, color="green")
color_tuple = (1.0, 1.0, 1.0, 0.0)
ax.w_xaxis.set_pane_color(color_tuple)
ax.w_yaxis.set_pane_color(color_tuple)
ax.w_zaxis.set_pane_color(color_tuple)
ax.w_xaxis.line.set_color(color_tuple)
ax.w_yaxis.line.set_color(color_tuple)
ax.w_zaxis.line.set_color(color_tuple)
ax.set_xticks([])
ax.set_yticks([])
ax.set_zticks([])
ax.set_xlabel('X-Axis')
ax.set_ylabel('Y-Axis')
ax.set_zlabel('Z-Axis')
plt.show()
실행 결과

위 코드를 실행하면 회색 배경 판과 축선, 눈금이 모두 사라지고 초록색 3D 막대그래프와 각 축의 레이블(X-Axis, Y-Axis, Z-Axis)만 깔끔하게 표시됩니다.
참고: 최신 Matplotlib 버전에서의 대체 방법
ax.w_xaxis, ax.w_yaxis, ax.w_zaxis는 최신 버전의 Matplotlib에서 사용이 권장되지 않습니다(deprecated). 최신 버전에서는 아래와 같이 ax.xaxis, ax.yaxis, ax.zaxis를 직접 사용하는 것이 좋습니다.
color_tuple = (1.0, 1.0, 1.0, 0.0) ax.xaxis.set_pane_color(color_tuple) ax.yaxis.set_pane_color(color_tuple) ax.zaxis.set_pane_color(color_tuple) ax.xaxis.line.set_color(color_tuple) ax.yaxis.line.set_color(color_tuple) ax.zaxis.line.set_color(color_tuple)
핵심 원리는 동일합니다. 축의 평면과 선 색상을 알파 값이 0인 완전히 투명한 색상으로 만들고, set_xticks([]) 등으로 눈금을 비우면 축 자체는 보이지 않으면서 set_xlabel(), set_ylabel(), set_zlabel()로 설정한 레이블은 그대로 유지됩니다.