본 콘텐츠의 이미지 및 내용은 AI로 생성되었습니다.
본 콘텐츠의 이미지 및 내용을 무단으로 복제, 배포, 수정하여 사용할 경우 저작권법에 의해 법적 제재를 받을 수 있습니다.
이미지 로딩 중...
AI Generated
2025. 12. 1. · 11 Views
Matplotlib 심화 서브플롯과 스타일 완벽 가이드
데이터 시각화의 핵심인 Matplotlib의 서브플롯과 스타일링을 초급자도 쉽게 이해할 수 있도록 설명합니다. 다중 그래프 배치부터 전문가급 스타일 적용까지 실무에서 바로 활용할 수 있는 기법을 다룹니다.
목차
1. subplots로 다중 그래프
김개발 씨는 회사에서 분기별 매출 보고서를 작성하고 있었습니다. 매출, 비용, 이익을 각각 따로 그래프로 그렸더니 보고서가 너무 길어졌습니다.
"이걸 한 화면에 깔끔하게 보여줄 수 없을까요?" 팀장님의 피드백에 김개발 씨는 고민에 빠졌습니다.
subplots는 하나의 그림(Figure) 안에 여러 개의 그래프를 격자 형태로 배치하는 기능입니다. 마치 액자 프레임 안에 여러 장의 사진을 나란히 배열하는 것과 같습니다.
이 기능을 활용하면 관련 있는 데이터들을 한눈에 비교할 수 있어 분석 효율이 크게 높아집니다.
다음 코드를 살펴봅시다.
import matplotlib.pyplot as plt
import numpy as np
# 샘플 데이터 생성
x = np.linspace(0, 10, 100)
# 2행 2열의 서브플롯 생성
fig, axes = plt.subplots(nrows=2, ncols=2, figsize=(10, 8))
# 각 서브플롯에 그래프 그리기
axes[0, 0].plot(x, np.sin(x))
axes[0, 0].set_title('Sine Wave')
axes[0, 1].plot(x, np.cos(x))
axes[0, 1].set_title('Cosine Wave')
axes[1, 0].plot(x, np.exp(-x/5))
axes[1, 0].set_title('Exponential Decay')
axes[1, 1].plot(x, np.log(x + 1))
axes[1, 1].set_title('Logarithm')
plt.tight_layout()
plt.show()
김개발 씨는 입사 6개월 차 데이터 분석가입니다. 오늘도 열심히 보고서를 작성하던 중, 팀장님으로부터 예상치 못한 요청을 받았습니다.
"매출, 비용, 이익 그래프를 한 페이지에 보여줄 수 있어요? 따로따로 보니까 비교가 어렵네요." 선배 개발자 박시니어 씨가 다가와 화면을 살펴봅니다.
"아, subplots를 쓰면 되죠. 여러 그래프를 한 번에 배치할 수 있어요." 그렇다면 subplots란 정확히 무엇일까요?
쉽게 비유하자면, subplots는 마치 사진 액자 프레임과 같습니다. 큰 프레임 하나 안에 여러 개의 작은 칸이 있고, 각 칸에 서로 다른 사진을 넣을 수 있습니다.
마찬가지로 subplots도 하나의 큰 그림(Figure) 안에 여러 개의 작은 그래프 영역(Axes)을 만들어줍니다. subplots가 없던 시절에는 어땠을까요?
개발자들은 그래프 하나를 그릴 때마다 새로운 창을 열어야 했습니다. 세 개의 그래프를 비교하려면 세 개의 창을 번갈아가며 봐야 했죠.
보고서에 넣으려면 각각 이미지로 저장한 뒤 문서 편집기에서 다시 배치해야 하는 번거로움이 있었습니다. 바로 이런 문제를 해결하기 위해 subplots가 등장했습니다.
**plt.subplots(nrows=2, ncols=2)**를 호출하면 2행 2열, 총 4개의 그래프 영역이 생성됩니다. 반환값으로 fig와 axes를 받는데, fig는 전체 그림을, axes는 각 그래프 영역의 배열을 의미합니다.
위의 코드를 한 줄씩 살펴보겠습니다. 먼저 fig, axes = plt.subplots(nrows=2, ncols=2, figsize=(10, 8)) 부분을 봅시다.
여기서 figsize는 전체 그림의 크기를 인치 단위로 지정합니다. 가로 10인치, 세로 8인치의 캔버스가 만들어집니다.
다음으로 **axes[0, 0]**은 첫 번째 행, 첫 번째 열의 그래프 영역을 가리킵니다. 파이썬의 배열 인덱싱과 동일하게 0부터 시작한다는 점을 기억하세요.
axes[1, 1]은 두 번째 행, 두 번째 열의 영역입니다. tight_layout() 함수는 마법 같은 역할을 합니다.
서브플롯들이 서로 겹치지 않도록 자동으로 간격을 조절해줍니다. 이 한 줄이 없으면 제목과 축 레이블이 서로 겹쳐서 읽기 어려워질 수 있습니다.
실제 현업에서는 어떻게 활용할까요? 예를 들어 쇼핑몰의 대시보드를 만든다고 가정해봅시다.
일별 매출, 방문자 수, 전환율, 평균 구매 금액을 한 화면에 보여주고 싶다면 2x2 subplots가 딱입니다. 경영진이 한눈에 핵심 지표를 파악할 수 있게 됩니다.
하지만 주의할 점도 있습니다. 초보 개발자들이 흔히 하는 실수 중 하나는 1행 또는 1열짜리 서브플롯에서 인덱싱 오류를 내는 것입니다.
**plt.subplots(1, 3)**으로 만들면 axes는 2차원 배열이 아니라 1차원 배열이 됩니다. 따라서 axes[0, 1]이 아니라 axes[1]로 접근해야 합니다.
다시 김개발 씨의 이야기로 돌아가 봅시다. 박시니어 씨의 설명을 들은 김개발 씨는 금방 4개의 그래프를 한 화면에 담아냈습니다.
"와, 이렇게 깔끔하게 정리되다니!" 팀장님도 만족스러운 표정을 지었습니다.
실전 팁
💡 - figsize를 적절히 조절하여 그래프가 너무 작거나 크지 않게 하세요
- tight_layout() 또는 constrained_layout=True 옵션으로 레이아웃 겹침을 방지하세요
- 1행 또는 1열일 때는 squeeze=False 옵션으로 항상 2차원 배열을 받을 수 있습니다
2. figure와 axes 객체
김개발 씨는 subplots를 배우고 나서 한 가지 의문이 생겼습니다. "fig랑 axes가 뭐가 다른 거죠?
그냥 plt.plot()만 써도 그래프가 그려지던데요." 박시니어 씨는 빙그레 웃으며 대답했습니다. "그게 바로 Matplotlib의 핵심 구조야.
제대로 알면 훨씬 정교한 그래프를 만들 수 있어."
Figure는 그래프가 그려지는 전체 도화지(캔버스)이고, Axes는 그 도화지 위에 올라가는 개별 그래프 영역입니다. 마치 미술 시간에 큰 도화지(Figure) 위에 여러 개의 그림(Axes)을 그리는 것과 같습니다.
이 두 객체를 명확히 구분하면 그래프의 모든 요소를 세밀하게 제어할 수 있습니다.
다음 코드를 살펴봅시다.
import matplotlib.pyplot as plt
import numpy as np
# Figure 객체 직접 생성
fig = plt.figure(figsize=(12, 5))
# 첫 번째 Axes: 전체의 왼쪽 절반
ax1 = fig.add_axes([0.1, 0.1, 0.35, 0.8]) # [left, bottom, width, height]
ax1.plot([1, 2, 3, 4], [1, 4, 2, 3])
ax1.set_title('First Plot')
# 두 번째 Axes: 전체의 오른쪽 절반
ax2 = fig.add_axes([0.55, 0.1, 0.35, 0.8])
ax2.bar([1, 2, 3, 4], [3, 1, 4, 2])
ax2.set_title('Second Plot')
# Figure 전체 제목
fig.suptitle('Understanding Figure and Axes', fontsize=14)
plt.show()
김개발 씨는 Matplotlib를 쓰면서 항상 궁금했습니다. plt.plot()으로 그래프를 그릴 때 뒤에서 무슨 일이 일어나는 걸까요?
박시니어 씨가 화이트보드에 그림을 그리며 설명하기 시작했습니다. "Matplotlib는 크게 두 가지 방식으로 사용할 수 있어.
하나는 pyplot 인터페이스, 다른 하나는 객체 지향 인터페이스야." pyplot 인터페이스는 plt.plot(), plt.xlabel()처럼 함수를 직접 호출하는 방식입니다. 간단하고 빠르게 그래프를 그릴 수 있어서 초보자에게 친숙합니다.
하지만 복잡한 그래프를 만들 때는 한계가 있습니다. 객체 지향 인터페이스는 Figure와 Axes 객체를 직접 다루는 방식입니다.
처음에는 조금 복잡해 보이지만, 이 방식을 익히면 그래프의 모든 요소를 정밀하게 제어할 수 있습니다. 그렇다면 Figure와 Axes의 관계는 어떻게 이해하면 좋을까요?
쉽게 비유하자면, Figure는 미술관의 벽면과 같습니다. 넓은 흰 벽이 있고, 그 위에 여러 점의 그림을 걸 수 있습니다.
Axes는 각각의 그림 액자입니다. 하나의 벽면에 한 점만 걸 수도 있고, 여러 점을 나란히 걸 수도 있습니다.
코드에서 **fig.add_axes([0.1, 0.1, 0.35, 0.8])**를 살펴봅시다. 네 개의 숫자는 순서대로 왼쪽 여백, 아래 여백, 너비, 높이를 의미합니다.
모두 0에서 1 사이의 비율값입니다. 0.1은 Figure 전체 너비의 10%를 뜻합니다.
이 방식의 강력한 점은 그래프를 원하는 위치에 자유롭게 배치할 수 있다는 것입니다. subplots처럼 격자에 얽매이지 않습니다.
심지어 큰 그래프 안에 작은 그래프를 삽입하는 것도 가능합니다. **fig.suptitle()**은 Figure 전체의 제목을 설정합니다.
반면 **ax.set_title()**은 개별 Axes의 제목입니다. 이 차이를 이해하면 여러 서브플롯 위에 공통 제목을 깔끔하게 추가할 수 있습니다.
실무에서는 언제 객체 지향 방식을 써야 할까요? 첫째, 서브플롯을 다룰 때입니다.
여러 그래프를 배치하고 각각을 개별적으로 커스터마이징해야 한다면 객체 지향 방식이 훨씬 명확합니다. 둘째, 그래프를 함수로 만들 때입니다.
fig와 ax를 매개변수로 받으면 재사용 가능한 그래프 함수를 만들 수 있습니다. 셋째, 그래프를 파일로 저장할 때입니다.
fig.savefig()를 호출하면 해당 Figure만 정확히 저장됩니다. 주의할 점이 있습니다.
pyplot 방식과 객체 지향 방식을 섞어 쓰면 예상치 못한 결과가 나올 수 있습니다. 하나의 프로젝트에서는 일관된 방식을 유지하는 것이 좋습니다.
김개발 씨가 고개를 끄덕였습니다. "아, 그래서 전문가들이 항상 fig, ax = plt.subplots()로 시작하는 거군요!" 박시니어 씨가 미소 지었습니다.
"맞아, 이제 진짜 Matplotlib를 쓸 준비가 된 거야."
실전 팁
💡 - 간단한 그래프는 pyplot으로, 복잡한 그래프는 객체 지향으로 사용하세요
- fig, ax = plt.subplots()를 기본 시작점으로 삼으면 두 방식의 장점을 모두 활용할 수 있습니다
- ax.set_xlabel()과 ax.set_ylabel()로 축 레이블을 설정하세요
3. 색상, 마커, 선 스타일
김개발 씨가 만든 그래프를 본 디자이너 이크리 씨가 한마디 했습니다. "기능은 좋은데, 좀 밋밋하지 않아요?
색상이랑 선 스타일을 바꿔보면 어떨까요?" 김개발 씨는 당황했습니다. "그래프에 색상을 어떻게 넣죠?"
Matplotlib에서는 color, marker, linestyle 세 가지 속성으로 그래프의 시각적 스타일을 자유롭게 변경할 수 있습니다. 마치 그림을 그릴 때 펜의 색상, 점 찍는 모양, 선의 종류를 선택하는 것과 같습니다.
이 세 가지만 알면 데이터의 특성을 시각적으로 강조하는 전문가급 그래프를 만들 수 있습니다.
다음 코드를 살펴봅시다.
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 20)
fig, ax = plt.subplots(figsize=(10, 6))
# 다양한 스타일 적용
ax.plot(x, np.sin(x), color='blue', marker='o', linestyle='-', label='Sine')
ax.plot(x, np.cos(x), color='red', marker='s', linestyle='--', label='Cosine')
ax.plot(x, np.sin(x) * 0.5, color='#2ecc71', marker='^', linestyle=':', linewidth=2, label='Half Sine')
# 단축 표기법
ax.plot(x, np.cos(x) * 0.5, 'mp-.', label='Half Cosine') # m=magenta, p=pentagon, -.=dash-dot
ax.legend()
ax.set_title('Line Styles and Markers')
plt.show()
데이터 시각화에서 스타일은 단순한 꾸밈이 아닙니다. 올바른 스타일은 데이터의 의미를 더 명확하게 전달합니다.
박시니어 씨가 설명을 시작했습니다. "색상, 마커, 선 스타일.
이 세 가지만 알면 어떤 그래프든 만들 수 있어." 먼저 **색상(color)**부터 알아봅시다. Matplotlib는 여러 가지 방식으로 색상을 지정할 수 있습니다.
'blue', 'red'처럼 영문 색상명을 쓸 수 있고, 'b', 'r'처럼 약어도 가능합니다. 더 정밀한 색상이 필요하면 '#2ecc71'처럼 16진수 코드를 사용합니다.
**마커(marker)**는 데이터 포인트를 표시하는 기호입니다. 'o'는 원, 's'는 사각형(square), '^'는 삼각형을 의미합니다.
마커를 쓰면 선 그래프에서도 각 데이터 포인트의 정확한 위치를 알 수 있습니다. **선 스타일(linestyle)**은 점과 점을 잇는 선의 형태입니다.
'-'는 실선, '--'는 점선, ':'는 점점선, '-.'는 점쇄선입니다. 여러 데이터를 비교할 때 색상만으로 구분이 어려우면 선 스타일로 차별화할 수 있습니다.
코드의 마지막 plot을 보세요. **'mp-.'**라는 문자열 하나에 색상, 마커, 선 스타일이 모두 담겨 있습니다.
m은 magenta(자홍색), p는 pentagon(오각형 마커), -.는 점쇄선입니다. 이런 단축 표기법을 알면 코드가 훨씬 간결해집니다.
linewidth 매개변수는 선의 두께를 조절합니다. 기본값은 1인데, 강조하고 싶은 데이터는 2나 3으로 두껍게 그리면 눈에 띕니다.
그래프에 여러 데이터가 있을 때는 label을 지정하고 **ax.legend()**를 호출하세요. 범례가 자동으로 생성되어 어떤 선이 어떤 데이터인지 알려줍니다.
실무에서 자주 쓰이는 색상 팁을 드리겠습니다. 상승을 나타내는 데이터는 파란색이나 초록색, 하락은 빨간색으로 표현하는 것이 관례입니다.
또한 색맹 사용자를 고려해 색상만으로 구분하지 말고 마커나 선 스타일도 함께 다르게 하는 것이 좋습니다. 주의할 점이 있습니다.
너무 많은 색상과 스타일을 섞으면 오히려 그래프가 난잡해집니다. 보통 한 그래프에 5개 이상의 선이 있으면 읽기 어려워집니다.
그럴 때는 서브플롯으로 나누는 것을 고려하세요. 김개발 씨가 새로 만든 그래프를 본 이크리 씨가 엄지를 치켜세웠습니다.
"오, 이제 진짜 보고서에 쓸 만하네요!"
실전 팁
💡 - 색상 약어: b(blue), g(green), r(red), c(cyan), m(magenta), y(yellow), k(black), w(white)
- 자주 쓰는 마커: o(원), s(사각형), ^(삼각형), *(별), +(플러스)
- 프레젠테이션용 그래프는 linewidth를 2 이상으로 두껍게 하세요
4. 축 범위와 눈금 설정
김개발 씨의 그래프에는 한 가지 문제가 있었습니다. 데이터의 범위가 0부터 100인데, 그래프의 y축이 -10부터 110까지 나와서 여백이 너무 많았습니다.
"축 범위를 딱 맞게 조절할 수 없나요?" 김개발 씨의 질문에 박시니어 씨가 대답했습니다. "당연하지.
눈금까지 마음대로 설정할 수 있어."
xlim과 ylim으로 축의 표시 범위를 설정하고, xticks와 yticks로 눈금의 위치와 레이블을 지정할 수 있습니다. 마치 지도에서 보고 싶은 영역을 확대하고, 위도와 경도 눈금을 원하는 간격으로 표시하는 것과 같습니다.
이 기능을 활용하면 데이터에 딱 맞는 깔끔한 그래프를 만들 수 있습니다.
다음 코드를 살펴봅시다.
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 2 * np.pi, 100)
y = np.sin(x)
fig, ax = plt.subplots(figsize=(10, 6))
ax.plot(x, y)
# 축 범위 설정
ax.set_xlim(0, 2 * np.pi)
ax.set_ylim(-1.2, 1.2)
# x축 눈금 설정 (위치와 레이블)
ax.set_xticks([0, np.pi/2, np.pi, 3*np.pi/2, 2*np.pi])
ax.set_xticklabels(['0', 'π/2', 'π', '3π/2', '2π'])
# y축 눈금 설정
ax.set_yticks([-1, -0.5, 0, 0.5, 1])
# 그리드 추가
ax.grid(True, linestyle='--', alpha=0.7)
ax.set_title('Sine Wave with Custom Ticks')
plt.show()
그래프의 축 설정은 데이터를 얼마나 효과적으로 전달하느냐를 결정합니다. 잘못된 축 범위는 데이터를 왜곡되게 보이게 할 수 있습니다.
박시니어 씨가 예를 들었습니다. "주가 그래프를 생각해봐.
y축을 0부터 시작하면 5% 등락이 거의 안 보여. 반대로 범위를 너무 좁게 잡으면 작은 변동이 급등락처럼 보이지.
축 범위 하나로 사람들의 인식이 완전히 달라질 수 있어." **set_xlim(시작, 끝)**과 **set_ylim(시작, 끝)**은 축의 표시 범위를 지정합니다. 데이터 범위에 딱 맞게 설정하면 불필요한 여백이 사라지고, 데이터 패턴이 더 잘 보입니다.
**set_xticks()**는 눈금이 표시될 위치를 직접 지정합니다. 코드에서 삼각함수 그래프의 x축에 0, π/2, π, 3π/2, 2π 위치에 눈금을 찍었습니다.
수학적으로 의미 있는 지점에 눈금이 있어서 그래프를 읽기가 훨씬 쉬워집니다. **set_xticklabels()**는 눈금에 표시될 텍스트를 지정합니다.
숫자 대신 'π/2'처럼 의미 있는 레이블을 붙일 수 있습니다. xticks와 xticklabels의 개수는 반드시 일치해야 합니다.
**grid()**는 격자선을 추가합니다. linestyle='--'로 점선 격자를, alpha=0.7로 70% 투명도를 적용했습니다.
격자선이 있으면 데이터 값을 대략적으로 읽기 쉽습니다. 축 설정에서 자주 쓰이는 추가 기능들이 있습니다.
**ax.invert_yaxis()**는 y축을 뒤집습니다. 순위 데이터처럼 1이 위에 와야 할 때 유용합니다.
**ax.set_xscale('log')**는 로그 스케일로 변환합니다. 데이터 범위가 매우 넓을 때 사용합니다.
실무에서 흔히 하는 실수 중 하나는 눈금 레이블이 겹치는 것입니다. x축 레이블이 길거나 데이터가 많으면 글자가 겹쳐서 읽기 어려워집니다.
이럴 때는 **plt.xticks(rotation=45)**로 레이블을 기울이거나, 눈금 개수를 줄이세요. 또 다른 팁으로, **ax.tick_params(axis='both', labelsize=12)**를 사용하면 눈금 레이블의 글자 크기를 한 번에 조절할 수 있습니다.
프레젠테이션용 그래프는 글자를 크게 해야 멀리서도 읽힙니다. 김개발 씨는 이제 축 범위와 눈금을 자유자재로 다룰 수 있게 되었습니다.
데이터의 핵심을 정확히 보여주는 그래프, 그것이 바로 좋은 시각화의 시작입니다.
실전 팁
💡 - ax.set_xlim()과 ax.set_ylim()의 인자 순서를 바꾸면 축을 반전시킬 수 있습니다
- 날짜 데이터는 matplotlib.dates 모듈의 DateFormatter를 활용하세요
- 눈금 레이블이 겹치면 rotation 매개변수로 기울이거나 fontsize를 줄이세요
5. 그래프 저장 (savefig)
드디어 그래프가 완성되었습니다. 김개발 씨는 이 그래프를 보고서에 넣어야 했습니다.
"화면에서는 잘 보이는데, 파일로 저장하면 흐릿해지거나 크기가 안 맞아요." 박시니어 씨가 말했습니다. "savefig의 옵션을 제대로 알면 그런 문제는 없어."
savefig는 그래프를 이미지 파일로 저장하는 함수입니다. PNG, PDF, SVG 등 다양한 형식을 지원하며, dpi(해상도)와 bbox_inches(여백 처리) 옵션으로 출력 품질을 세밀하게 조절할 수 있습니다.
마치 사진을 인화할 때 크기와 해상도를 선택하는 것과 같습니다.
다음 코드를 살펴봅시다.
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 100)
y = np.sin(x) * np.exp(-x/10)
fig, ax = plt.subplots(figsize=(8, 6))
ax.plot(x, y, 'b-', linewidth=2)
ax.set_xlabel('Time (s)')
ax.set_ylabel('Amplitude')
ax.set_title('Damped Oscillation')
# PNG로 저장 (고해상도)
fig.savefig('plot_high_res.png', dpi=300, bbox_inches='tight')
# PDF로 저장 (벡터 형식)
fig.savefig('plot_vector.pdf', bbox_inches='tight')
# 투명 배경으로 저장
fig.savefig('plot_transparent.png', dpi=150, transparent=True, bbox_inches='tight')
print("그래프가 저장되었습니다!")
plt.show()
그래프를 만드는 것과 저장하는 것은 다른 이야기입니다. 화면에서 잘 보이던 그래프가 저장하면 문제가 생기는 경우가 많습니다.
박시니어 씨가 말했습니다. "savefig를 그냥 쓰면 안 돼.
용도에 맞는 옵션을 알아야 해." dpi는 dots per inch의 약자로, 인치당 픽셀 수를 의미합니다. 기본값은 100입니다.
웹용 이미지는 100-150 정도면 충분하지만, 인쇄용이나 프레젠테이션용은 300 이상이 좋습니다. dpi가 높을수록 파일 크기도 커지니 용도에 맞게 선택하세요.
**bbox_inches='tight'**는 그래프 주변의 불필요한 여백을 자동으로 제거합니다. 이 옵션 없이 저장하면 그래프 주위에 큰 흰 여백이 생기는 경우가 많습니다.
거의 항상 이 옵션을 켜두는 것이 좋습니다. 파일 형식도 중요합니다.
PNG는 웹과 프레젠테이션에 적합한 래스터 형식입니다. 투명 배경을 지원하고 파일 크기도 적당합니다.
PDF와 SVG는 벡터 형식으로, 확대해도 깨지지 않습니다. 논문이나 고품질 인쇄물에는 벡터 형식이 좋습니다.
transparent=True 옵션은 배경을 투명하게 만듭니다. 슬라이드에 그래프를 올릴 때 배경색이 다르면 흰 박스가 눈에 거슬립니다.
투명 배경으로 저장하면 어떤 배경에도 자연스럽게 어울립니다. 한 가지 중요한 점이 있습니다.
savefig()는 plt.show() 전에 호출해야 합니다. plt.show()가 호출되면 Figure가 비워지기 때문입니다. 또한 pyplot 방식을 쓸 때는 plt.savefig()를, 객체 지향 방식을 쓸 때는 fig.savefig()를 사용하세요.
facecolor 옵션으로 배경색을 지정할 수도 있습니다. fig.savefig('plot.png', facecolor='white')처럼 쓰면 흰 배경으로 저장됩니다.
일부 환경에서는 기본 배경이 투명이라 이상하게 보일 수 있어서, 명시적으로 흰색을 지정하면 안전합니다. 실무에서는 그래프 저장을 자동화하는 경우가 많습니다.
매일 새 데이터로 그래프를 생성해서 저장하고, 이메일로 보내거나 웹사이트에 업로드합니다. 이때 파일명에 날짜를 넣으면 관리가 편합니다.
김개발 씨는 이제 고해상도 그래프를 자유자재로 저장할 수 있게 되었습니다. "인쇄해도 선명하네요!" 팀장님의 칭찬에 김개발 씨가 뿌듯해했습니다.
실전 팁
💡 - 인쇄용은 dpi=300 이상, 웹용은 dpi=100-150으로 설정하세요
- bbox_inches='tight'는 거의 항상 사용하는 것이 좋습니다
- 벡터 형식(PDF, SVG)은 나중에 크기 조절이 필요할 때 유용합니다
6. 스타일 테마 적용
김개발 씨는 그래프를 만들 때마다 색상, 폰트, 배경색을 일일이 지정하는 게 번거로웠습니다. "매번 같은 설정을 반복하는 게 비효율적이에요." 박시니어 씨가 웃으며 대답했습니다.
"Matplotlib에는 미리 정의된 스타일 테마가 있어. 한 줄이면 전체 분위기가 바뀌지."
**plt.style.use()**를 사용하면 미리 정의된 스타일 테마를 적용할 수 있습니다. 'seaborn', 'ggplot', 'dark_background' 등 다양한 테마가 있으며, 한 줄의 코드로 그래프의 전체적인 분위기를 바꿀 수 있습니다.
마치 문서 편집기의 테마를 바꾸면 전체 문서 스타일이 일괄 변경되는 것과 같습니다.
다음 코드를 살펴봅시다.
import matplotlib.pyplot as plt
import numpy as np
# 사용 가능한 스타일 목록 확인
print("Available styles:", plt.style.available)
x = np.linspace(0, 10, 100)
# 스타일 적용
plt.style.use('seaborn-v0_8-whitegrid')
fig, axes = plt.subplots(2, 2, figsize=(12, 10))
# 각 서브플롯에 다른 그래프 그리기
axes[0, 0].plot(x, np.sin(x), label='sin')
axes[0, 0].plot(x, np.cos(x), label='cos')
axes[0, 0].legend()
axes[0, 0].set_title('Line Plot')
axes[0, 1].bar(['A', 'B', 'C', 'D'], [3, 7, 2, 5])
axes[0, 1].set_title('Bar Chart')
axes[1, 0].scatter(np.random.randn(50), np.random.randn(50), alpha=0.6)
axes[1, 0].set_title('Scatter Plot')
axes[1, 1].hist(np.random.randn(1000), bins=30, edgecolor='white')
axes[1, 1].set_title('Histogram')
plt.tight_layout()
plt.show()
매번 그래프를 그릴 때마다 색상, 폰트, 격자선을 일일이 설정하는 것은 비효율적입니다. Matplotlib의 스타일 시스템은 이 문제를 해결해줍니다.
plt.style.available을 출력하면 사용 가능한 모든 스타일 목록을 볼 수 있습니다. Matplotlib 버전에 따라 다르지만 보통 20개 이상의 스타일이 내장되어 있습니다.
자주 사용되는 스타일을 소개하겠습니다. seaborn 계열 스타일은 통계 시각화 라이브러리 Seaborn의 깔끔한 디자인을 적용합니다.
'seaborn-v0_8-whitegrid', 'seaborn-v0_8-darkgrid' 등이 있습니다. 학술 논문이나 데이터 분석 보고서에 적합합니다.
ggplot은 R 언어의 유명한 시각화 라이브러리 ggplot2의 스타일을 따릅니다. 회색 배경에 흰 격자선이 특징입니다.
dark_background는 어두운 배경에 밝은 색상의 그래프를 그립니다. 프레젠테이션이나 대시보드에 인상적입니다.
bmh는 Bayesian Methods for Hackers라는 책에서 사용된 스타일입니다. 부드러운 색감이 특징입니다.
fivethirtyeight는 유명 데이터 저널리즘 사이트 FiveThirtyEight의 스타일을 따릅니다. 스타일을 일시적으로만 적용하고 싶다면 with 문을 사용하세요.
**with plt.style.context('ggplot'):**처럼 쓰면 해당 블록 안에서만 스타일이 적용되고, 블록이 끝나면 원래 스타일로 돌아옵니다. 여러 스타일을 조합할 수도 있습니다.
**plt.style.use(['seaborn-v0_8', 'fast'])**처럼 리스트로 전달하면 뒤에 있는 스타일이 앞의 스타일을 덮어씁니다. 자신만의 스타일을 만들 수도 있습니다.
.mplstyle 파일을 만들어서 원하는 설정을 저장해두면, 팀 전체가 일관된 스타일의 그래프를 만들 수 있습니다. 회사 브랜드 색상을 적용한 커스텀 스타일을 만들어두면 매우 유용합니다.
주의할 점이 있습니다. plt.style.use()는 전역 설정을 변경합니다.
한 번 적용하면 이후 모든 그래프에 영향을 미칩니다. 스크립트 시작 부분에서 한 번만 호출하거나, with 문으로 범위를 제한하는 것이 좋습니다.
김개발 씨는 이제 한 줄의 코드로 전문가처럼 보이는 그래프를 만들 수 있게 되었습니다. "스타일 하나 바꿨을 뿐인데 완전히 다른 느낌이네요!" 코드는 짧지만 효과는 강력합니다.
실전 팁
💡 - 프레젠테이션용은 'seaborn-v0_8-talk'처럼 큰 글꼴 스타일을 사용하세요
- 인쇄용은 'seaborn-v0_8-paper' 스타일이 적합합니다
- plt.rcParams로 개별 설정을 추가로 커스터마이징할 수 있습니다
이상으로 학습을 마칩니다. 위 내용을 직접 코드로 작성해보면서 익혀보세요!
댓글 (0)
함께 보면 좋은 카드 뉴스
Helm 마이크로서비스 패키징 완벽 가이드
Kubernetes 환경에서 마이크로서비스를 효율적으로 패키징하고 배포하는 Helm의 핵심 기능을 실무 중심으로 학습합니다. Chart 생성부터 릴리스 관리까지 체계적으로 다룹니다.
보안 아키텍처 구성 완벽 가이드
프로젝트의 보안을 처음부터 설계하는 방법을 배웁니다. AWS 환경에서 VPC부터 WAF, 암호화, 접근 제어까지 실무에서 바로 적용할 수 있는 보안 아키텍처를 단계별로 구성해봅니다.
AWS Organizations 완벽 가이드
여러 AWS 계정을 체계적으로 관리하고 통합 결제와 보안 정책을 적용하는 방법을 실무 스토리로 쉽게 배워봅니다. 초보 개발자도 바로 이해할 수 있는 친절한 설명과 실전 예제를 제공합니다.
AWS KMS 암호화 완벽 가이드
AWS KMS(Key Management Service)를 활용한 클라우드 데이터 암호화 방법을 초급 개발자를 위해 쉽게 설명합니다. CMK 생성부터 S3, EBS 암호화, 봉투 암호화까지 실무에 필요한 모든 내용을 담았습니다.
AWS Secrets Manager 완벽 가이드
AWS에서 데이터베이스 비밀번호, API 키 등 민감한 정보를 안전하게 관리하는 Secrets Manager의 핵심 개념과 실무 활용법을 배워봅니다. 초급 개발자도 쉽게 따라할 수 있도록 실전 예제와 함께 설명합니다.